利用RabbitMQ的TTL实现延迟队列

10 篇文章 0 订阅
1 篇文章 0 订阅

利用RabbitMQ的TTL实现延迟队列

RabbitMQ自带不支持延迟队列,但是可以利用TTL过期的特性,建立两个队列。生产端将信息发送到有过期时间的队列,当消息长时间不消费(达到过期时间)就会转为私信队列,只需要在过期前将信息压入正常的队列中,让消费端监听这个正常队列就行。

在这里插入图片描述

首先配置两个队列,一个为死信队列Queue1,一个是正常消费的队列Queue2

/**
 * 配置两个队列,队列1为死信队列,队列2为正常消费队列
 */
@Configuration
public class MqConfig {
    /**
     * 死信队列 orderDeadQueue
     * @return orderDeadQueue
     */
    @Bean
    public Queue orderDeadQueue(){
        return QueueBuilder.durable("orderDeadQueue")
                .withArgument("x-dead-letter-exchange","orderExchange")//过期时发送到orderExchange交换机
                .withArgument("x-dead-letter-routing-key","orderListQueue")//对应orderListQueue队列
                .build();

    }

    /**
     * 用户正常监听的队列
     * @return
     */
    @Bean
    public Queue orderListQueue(){
        return new Queue("orderListQueue",true);
    }

    /**
     * 创建交换机
     */
    @Bean
    public Exchange orderExchange(){
        return new DirectExchange("orderExchange");
    }
    /**
     * 绑定交换机和队列
     */
    @Bean
    public Binding binding(@Autowired  Exchange orderExchange,@Autowired  Queue orderListQueue){
        return BindingBuilder.bind(orderListQueue).to(orderExchange).with("orderListQueue").noargs();
    }
}

创建一个监听器用于监听正常消费的队列 orderListQueue

@Component
@RabbitListener(queues = "orderListQueue")
public class MQDeadListener {
    @RabbitHandler
    public void ExecuteMessage(String message){
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("消费的时间为:"+simpleDateFormat.format(new Date()));
        System.out.println("消费的消息为:"+message);
    }
}

测试:

@SpringBootTest(classes = OrderApplication.class)
@RunWith(SpringRunner.class)
public class RabbitMqTest {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    /**
     * 使用rabbitTemplate发送信息到队列1
     * 过期时间为10s
     * 当队列1的消息过期时就会将消息发送到队列2
     * 消费者只需要监听队列2即可
     * 从而实现延迟队列
     */
    @Test
    public void  test01(){
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String date = "我觉得还好"+simpleDateFormat.format(new Date());

        rabbitTemplate.convertAndSend("orderDeadQueue", (Object) date, new MessagePostProcessor() {
            @Override
            public Message postProcessMessage(Message message) throws AmqpException {
                message.getMessageProperties().setExpiration(10000+"");
                return message;
            }
        });
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值