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确认机制呢

使用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+定时任务
         } 
  } 
}