RabbitMQ 消息延时失效的个人问题解决

RabbitMQ 消息延时失效的个人问题解决,第1张

RabbitMQ 消息延时失效的个人问题解决 RabbitMQ 消息延时失效的个人问题解决

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(){
        Map arguments = 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

更多的大家还是要浏览链接,更加的详细

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5681661.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存