热心市民鞠先生 2021-09-08 14:18 采纳率: 80%
浏览 51
已结题

rabbitmq如何开启生产者的confirm确认机制

这是我的配置类
public class MQConfig {

/**
 * //direct、topic、fanout。direct直连模式,指定某个队列接收
 * topic通配符模式,同上  但是支持通配符
 * fanout广播模式。所有队列都能接收到消息
 * @return
 */
@Bean(MQ.EXCHANGE_COURSE_ONLINE)
public Exchange EXCHANGE_NAME_TOPIC(){
    return ExchangeBuilder.topicExchange(MQ.EXCHANGE_COURSE_ONLINE).durable(true).build();//durable(true)开启持久化
}

/**
 * 创建队列
 * @return
 */
@Bean(MQ.QUEUE_COURSE_ONLINE_MAIL)
public Queue QUEUE_NAME_MAIL(){
    return QueueBuilder.durable(MQ.QUEUE_COURSE_ONLINE_MAIL).build();
}
@Bean(MQ.QUEUE_COURSE_ONLINE_SMS)
public Queue QUEUE_NAME_SMS(){
    return QueueBuilder.durable(MQ.QUEUE_COURSE_ONLINE_SMS).build();
}

/**
 * 绑定交换机到队列
 * @param emailQueue
 * @param exchange
 * @return
 */
@Bean
public Binding emailQueueBinding(@Qualifier(MQ.QUEUE_COURSE_ONLINE_MAIL) Queue emailQueue, Exchange exchange){
    return BindingBuilder.bind(emailQueue).to(exchange).with("mail.#").noargs();
}
@Bean
public Binding smsQueueBinding(@Qualifier(MQ.QUEUE_COURSE_ONLINE_SMS) Queue smsQueue, Exchange exchange){
    return BindingBuilder.bind(smsQueue).to(exchange).with("sms.#").noargs();
}

}
生产者是这样发送消息的
rabbitTemplate.convertAndSend(MQ.EXCHANGE_COURSE_ONLINE,"sms.course.online", courses);
rabbitTemplate.convertAndSend(MQ.EXCHANGE_COURSE_ONLINE,"mail.course.online", courses);

那么我应该怎么开启生产者的confirm确认机制呢

  • 写回答

1条回答 默认 最新

  • Forrest Gump plus 2021-09-08 14:52
    关注

    使用Confirm发布确认机制,rabbitmq配置模板中配置回调处理类(confirm-callback),然后声明改处理类继承RabbitTemplate.ConfirmCallback接口。
    这个机制比事务机制好多了,因为如果使用事务,一组数据中如果有一个数据出现问题,该数组据就得撤销回滚,而Confirm发布确认机制,如果一组数据中有一个数据出现问题了,只需要补发失败消息,就行了
    例如:

    public class MsgSendConfirmCallback implements RabbitTemplate.ConfirmCallback {
     public void confirm(CorrelationData correlationData, boolean b, String s) { 
            if (b){ 
                  System.out.println("消息确认成功!!"); 
            } else { 
                  System.out.println("消息确认失败。。。"); 
                  // 如果本条消息一定要发送到队列中,例如下订单消息,我们可以采用消息补发
                  // 采用递归(固定次数,不可无限)或 redis+定时任务
             } 
      } 
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 9月16日
  • 已采纳回答 9月8日
  • 创建了问题 9月8日

悬赏问题

  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮