Coup de Grace

基于rabbitmq的延迟队列

使用的还是走死信投递那一套,因为那个社区贡献的插件我觉得并不太好用..

原理如下图:

微服务中的 MQ 应用另外再写.

不用插件的话,本文内的东西用在 delay 与 retry 场景是比较合适的.


代码

@Configuration
public class RabbitConfig {
  
    private static final String DELAY_EXCHANGE = "tt.delay.exchange";
    private static final String DLX_QUEUE = "tt.dlx.queue";
    private static final String DELAY_QUEUE = "tt.delay.queue";
  
    @Bean
    public Queue qtDLXQueue() {
        Map<String, Object> arguments = Maps.newHashMap();
        arguments.put("x-dead-letter-exchange", DELAY_EXCHANGE);
        arguments.put("x-dead-letter-routing-key", DELAY_QUEUE);
        return new Queue(DLX_QUEUE,true,false,false,arguments);
    }

}

省略掉了一些无用的重复定义,当然也可以预先直接在 management 里定义+绑定好.

主要功能就是向 dlx发消息,从 delay 消费.

那么

@Component
public class DelaySender {
  
    @Autowired
    private RabbitTemplate rabbitTemplate;
  
    public void send(String msg){
        String context = "tt";
        rabbitTemplate.convertAndSend("tt.delay",
                                        "tt.dlx", 
                                        context, 
                                        message -> {
            message.getMessageProperties().setExpiration("120000");
            return message;
        });
    }
}

坊间传闻堆积量大了如何如何,可是那个插件也没好到哪儿去.


done.