/***正常消息队列,队列最大长度5*/
GetMapping("/normalQueue")publicStringnormalQueue(){MapString,Objectmap=newHashMap();map.put("messageId",String.valueOf(UUID.randomUUID()));map.put("data",System.currentTimeMillis()+",正常队列消息,最大长度5");rabbitTemplate.convertAndSend("normalExchange","normalRouting",map,newCorrelationData());returnJSONObject.toJSONString(map);}MQ结果如下:消息TTL过期消息的TTL指的是消息的存活时间,我们可以通过设置消息的TTL或者队列的TTL来实现。消息的TTL:对于设置了过期时间属性(expiration)的消息,消息如果在过期时间内没被消费,会过期队列的TTL:对于设置了过期时间属性(x-message-ttl)的队列,所有路由到这个队列的消息,都会设置上这个过期时间两种配置都行,一般都用在定时任务,限时支付这种地方。/***消息TTL,timetolive*/
GetMapping("/ttlToDead")publicStringttlToDead(){MapString,Objectmap=newHashMap();map.put("messageId",String.valueOf(UUID.randomUUID()));map.put("data",System.currentTimeMillis()+",ttl队列消息");rabbitTemplate.convertAndSend("normalExchange","ttlRouting",map,newCorrelationData());returnJSONObject.toJSONString(map);}发送后:等待过期后:Demo中只是为了方便,代码中尽量使用消息TTL,不要用队列TTL拒绝消息正常队列消费后拒绝消息,并且不进行重新入队:ComponentRabbitListener(queues="normalQueue")publicclassNormalConsumer{RabbitHandlerpublicvoidprocess(MapString,Objectmessage,Channelchannel,MessagemqMsg)throwsIOException{System.out.println("收到消息,并拒绝重新入队:"+message.toString());channel.basicReject(mqMsg.getMessageProperties().getDeliveryTag(),false);}}MQ控制台:死信队列消费:ComponentRabbitListener(queues="deadQueue")publicclassDeadConsumer{RabbitHandlerpublicvoidprocess(MapString,Objectmessage,Channelchannel,MessagemqMsg)throwsIOException{System.out.println("死信队列收到消息:"+message.toString());channel.basicAck(mqMsg.getMessageProperties().getDeliveryTag(),false);}}消息顺序和实验一致:死信队列收到消息:{data=5,正常队列消息,最大长度5,messageId=bceb-da38--ac88-d22cbe}死信队列收到消息:{data=5,ttl队列消息,messageId=a-5aab-4fac-aec7-ea}死信队列收到消息:{data=5,正常队列消息,最大长度5,messageId=b65ecaab-5ce7--a32c-c90b67ec46da}死信队列收到消息:{data=8,正常队列消息,最大长度5,messageId=d63d2a4c-e7d3-4f00-a6ca-78e2d62d1d92}死信队列收到消息:{data=7,正常队列消息,最大长度5,messageId=eed0c-b-43dc-aa79-ca}死信队列收到消息:{data=1,正常队列消息,最大长度5,messageId=7a7bd-f2fa-4a74-b9e6-ac7cbb3d4}死信队列收到消息:{data=4,正常队列消息,最大长度5,messageId=9dea1-4ca4---27aba01c}来源: