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

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+定时任务
             } 
      } 
    }
    
    
    已采纳该答案
    打赏 评论

相关推荐 更多相似问题