热心市民鞠先生 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日

悬赏问题

  • ¥15 想问一下树莓派接上显示屏后出现如图所示画面,是什么问题导致的
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)
  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号