RabbitMQ 消息延时失效的个人问题解决
RabbitMQ 消息延时失效的个人问题解决
今天我在学习尚硅谷rabbitmq课程视频的时候,遇到了一个让我非常苦恼的问题:
**
问题详情
**
我在学习至延迟队列的时候,根据自己的学习心得写了模式和尚硅谷老师一样的代码:
配置中心的代码如下:
@Configuration
public class DelayedMessageConfig {
/**
* 延迟交换机
*/
public static final String DELAYED_EXCHANGE = "delayed.exchange";
/**
* 延迟队列
*/
public static final String DELAYED_QUEUE = "delayed.queue";
/**
* 延迟路由key
*/
public static final String DELAYED_ROUTING_KEY = "delayed.routing.key";
/**
* 定制交换机为延迟交换机
*/
public static final String X_DELAYED_MESSAGE = "x-delayed-message";
/**
* 定制交换机参数argument key声明交换机类型
*/
public static final String X_DELAYED_TYPE = "x-delayed-type";
/**
* 声明延迟交换机
* CustomExchange()参数:
* 1:交换机名
* 2:延迟交换机专属类型
* 3:持久化
* 4:自动删除
* 5:参数map(这里只需传入key = X_DELAYED_TYPE,value = '交换机类型')
* @return CustomExchange
*/
@Bean("exchange")
public CustomExchange delayedExchange(){
Map<String, Object> arguments = new HashMap<>(16);
arguments.put(X_DELAYED_TYPE,"direct");
return new CustomExchange(
DELAYED_EXCHANGE,
X_DELAYED_MESSAGE,
true,
false,
arguments
);
}
/**
* 声明队列
* @return Queue
*/
@Bean("queue")
public Queue delayedQueue(){
return new Queue(DELAYED_QUEUE);
}
/**
* 绑定
* @param queue
* 声明好的队列
* @param delayedExchange
* 声明好的延迟交换机
* @return Binding
*/
@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