RabbitMQ 消息延时失效的个人问题解决
今天我在学习尚硅谷rabbitmq课程视频的时候,遇到了一个让我非常苦恼的问题:
**
问题详情**
我在学习至延迟队列的时候,根据自己的学习心得写了模式和尚硅谷老师一样的代码:
配置中心的代码如下:
@Configuration public class DelayedMessageConfig { public static final String DELAYED_EXCHANGE = "delayed.exchange"; public static final String DELAYED_QUEUE = "delayed.queue"; public static final String DELAYED_ROUTING_KEY = "delayed.routing.key"; public static final String X_DELAYED_MESSAGE = "x-delayed-message"; public static final String X_DELAYED_TYPE = "x-delayed-type"; @Bean("exchange") public CustomExchange delayedExchange(){ Maparguments = new HashMap<>(16); arguments.put(X_DELAYED_TYPE,"direct"); return new CustomExchange( DELAYED_EXCHANGE, X_DELAYED_MESSAGE, true, false, arguments ); } @Bean("queue") public Queue delayedQueue(){ return new Queue(DELAYED_QUEUE); } @Bean public Binding bingDelayedQueueAndExchange( @Qualifier("queue") Queue queue, @Qualifier("exchange") CustomExchange delayedExchange) { return BindingBuilder.bind(queue).to(delayedExchange).with(DELAYED_ROUTING_KEY).noargs(); }
消费者代码如下:
@Slf4j @Component public class DelayedQueueConsumer { @RabbitListener(queues = DelayedMessageConfig.DELAYED_QUEUE) public void receiveDelayedQueue(Message message){ String msg = new String(message.getBody()); log.info("当前时间:{},收到的延迟消息:{}",new Date(),msg); } }
生产者通过访问项目的方式发消息,代码如下:
@Slf4j @RestController @RequestMapping("/ttl") public class SendMsgController { @Autowired private AmqpTemplate rabbitTemplate; @RequestMapping(value = "/sendDelayedMsg/{message}/{delayedTime}",method = RequestMethod.GET) public void sendDelayedMsg(@PathVariable String message,@PathVariable String delayedTime){ log.info( "当前时间:{},时长:{},发送一条信息给延迟队列:{}", new Date(), delayedTime, message ); rabbitTemplate.convertAndSend( DelayedMessageConfig.DELAYED_EXCHANGE, DelayedMessageConfig.DELAYED_ROUTING_KEY, message, msg -> { msg.getMessageProperties().setExpiration(delayedTime); msg.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT); //msg.getMessageProperties().setHeader("x-delay",delayedTime); return msg; } ); } }
启动也是正常启动,但是当我发送消息的时候
http://localhost:8080/ttl/sendDelayedMsg/syp/20000
控制台发现:
这延迟消息根本就是失败的啊
搜了很多都没办法解决我的问题,当我在站内看到一个博哥的文章时我一条一条浏览最终问题得以解决:
大家可以看到我的生产者代码,拉姆达表达式里注掉了一行,那一行才是关键的实现延迟消息
我们将上面那行老的 setExpiration() 换做下面的setHeader(“x-delay”,delayedTime)#value是延迟时间,换做你的就好
这样成功解决延迟消息失效的问题,当然
https://blog.csdn.net/weixin_43945983/article/details/112938645
更多的大家还是要浏览链接,更加的详细欢迎分享,转载请注明来源:内存溢出
评论列表(0条)