rabbitmq:publisher confirms

0.背景

最近在我们的业务系统中遇到一个问题,

publisher行为:convertAndSend然后打日志。

consumer行为:@RabbitListener接到消息立刻打日志。

问题是,publisher打出了发送消息的日志,consumer没打出收到消息的日志。

基于这种情况,准备启用rabbitmq java clientReturnCallbackConfirmCallback机制,先确认消息是否成功发到了正确的queue里面。

之前没有用Callback,因为对于我们的场景,Rabbitmq还是非常稳定的,即使极少出现的异常情况,我们也有办法把丢掉的消息补发,因此没必要浪费Channel资源去让rabbitmq server给发送确认信息,也不想平白增加系统复杂性。

1.代码实现

一般我们使用rabbitmq可能会配置下面几个bean(不论通过何种方式,xml@Configuretion,或者spring bootautoconfigure),在此基础上,添加一些属性设置:

@Configuration
public class MqConfig {
   
    
    @Value("${rabbitmq.enableConfirm}")
    private boolean enableConfirm;
 
    @Value("${rabbitmq.enableReturn}")
    private boolean enableReturn;
    
    @Value("${rabbitmq.enableMessageCorrelation}")
    private boolean enableMessageCorrelation;
    
    @Bean
    public ConnectionFactory connectionFactory() {
   
        CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
        //省略其它属性设置...
        
        //根据配置决定是否开启 Confirm 机制
        connectionFactory.setPublisherConfirms(enableConfirm);
        //根据配置决定是否开启 Return 机制
        connectionFactory.setPublisherReturns(enableReturn);
        return connectionFactory;
    }
    
    @Bean
    public RabbitTemplate rabbitTemplate() throws Exception {
   
        //根据配置决定使用哪种 RabbitTemplate
        RabbitTemplate template = enableMessageCorrelation ?
                new CorrelationRabbitTemplate(connectionFactory()) : 
                new RabbitTemplate(connectionFactory());
        //省略其它属性设置...
        
        //如果启用 Confirm 机制,设置 ConfirmCallback
        if (enableConfirm) {
   
            template.setConfirmCallback(confirmCallback());
        }
        //如果启用 Return 机制,设置 ReturnCallback,及打开 Mandatory
        if (enableReturn) {
   
            template.setReturnCallback(returnCallback());
            template.setMandatory(true);
        }
        return template;
    }
}

对于Publisher而言,以上两个bean足以。

下面是 RabbitTemplate中需要的ConfirmCallbackReturnCallback

    @Bean
    @ConditionalOnMissingBean(value = RabbitTemplate.ConfirmCallback.class)
    public RabbitTemplate.ConfirmCallback confirmCallback() {
   
        return new RabbitTemplate.ConfirmCallback() {
   
            @Override
            public void confirm(CorrelationData correlationData, boolean ack, String cause) {
   
                // do something ...
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值