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

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

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

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
1. 添加rabbitmq依赖 在pom.xml中添加以下依赖: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> ``` 2. 配置rabbitmq连接信息 在application.properties中添加以下配置: ``` spring.rabbitmq.host=127.0.0.1 spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest ``` 3. 创建消息队列 在代码中创建消息队列,可以使用@Bean注解进行创建: ``` @Bean public Queue delayQueue() { return new Queue("delay_queue"); } ``` 4. 创建交换机 创建交换机,可以使用@Bean注解进行创建: ``` @Bean public DirectExchange delayExchange() { return new DirectExchange("delay_exchange"); } ``` 5. 绑定队列和交换机 将队列和交换机进行绑定,可以使用@Bean注解进行创建: ``` @Bean public Binding delayBinding() { return BindingBuilder.bind(delayQueue()).to(delayExchange()).with("delay_key"); } ``` 6. 设置延时消息的TTL 设置延时消息的TTL,可以使用@Bean注解进行创建: ``` @Bean public CustomExchange customExchange() { Map<String, Object> args = new HashMap<>(); args.put("x-delayed-type", "direct"); return new CustomExchange("delayed_exchange", "x-delayed-message", true, false, args); } ``` 7. 发送延时消息 发送延时消息,可以使用rabbitTemplate发送消息: ``` rabbitTemplate.convertAndSend("delayed_exchange", "delay_key", message, message1 -> { message1.getMessageProperties().setHeader("x-delay", delayTime); return message1; }); ``` 其中,delayTime为延时时间,单位为毫秒。 完整代码如下: ``` @Configuration public class RabbitmqConfig { @Autowired private RabbitTemplate rabbitTemplate; @Bean public Queue delayQueue() { return new Queue("delay_queue"); } @Bean public DirectExchange delayExchange() { return new DirectExchange("delay_exchange"); } @Bean public Binding delayBinding() { return BindingBuilder.bind(delayQueue()).to(delayExchange()).with("delay_key"); } @Bean public CustomExchange customExchange() { Map<String, Object> args = new HashMap<>(); args.put("x-delayed-type", "direct"); return new CustomExchange("delayed_exchange", "x-delayed-message", true, false, args); } public void sendDelayMessage(Object message, Integer delayTime) { rabbitTemplate.convertAndSend("delayed_exchange", "delay_key", message, message1 -> { message1.getMessageProperties().setHeader("x-delay", delayTime); return message1; }); } } ``` 调用sendDelayMessage方法即可发送延时消息

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值