package com.ycl.jxkg.rabbitmq; import lombok.extern.slf4j.Slf4j; import org.springframework.amqp.core.Binding; import org.springframework.amqp.core.BindingBuilder; import org.springframework.amqp.core.DirectExchange; import org.springframework.amqp.core.Queue; import org.springframework.amqp.rabbit.connection.ConnectionFactory; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.HashMap; import java.util.Map; /** * @author:xp * @date:2024/6/28 13:39 */ @Slf4j @Configuration public class RabbitMQConfig { @Autowired private ConnectionFactory connectionFactory; @Bean public DirectExchange jxkgExchange() { return new DirectExchange("jxkgExchange"); } // 创建考试普通队列 @Bean public Queue examQueue() { Map args = new HashMap<>(); // 设置死信交换机 args.put("x-dead-letter-exchange", "dlxExchange"); return new Queue("exam", true, false, false, args); } // 创建会议普通队列 @Bean public Queue meetQueue() { Map args = new HashMap<>(); // 设置死信交换机 args.put("x-dead-letter-exchange", "dlxExchange"); return new Queue("meet", true, false, false, args); } // 考试普通信队列到交换机 @Bean public Binding binding(Queue examQueue, DirectExchange jxkgExchange) { return BindingBuilder.bind(examQueue).to(jxkgExchange).with("exam"); } // 会议普通信队列到交换机 @Bean public Binding binding2(Queue meetQueue, DirectExchange jxkgExchange) { return BindingBuilder.bind(meetQueue).to(jxkgExchange).with("meet"); } // 创建死信交换机 @Bean public DirectExchange dlxExchange() { return new DirectExchange("dlxExchange"); } // 创建考试使用的死信队列 @Bean public Queue examDlxQueue() { return new Queue("examDlxQueue", true); } // 创建会议使用的死信队列 @Bean public Queue meetDlxQueue() { return new Queue("meetDlxQueue", true); } // 绑定考试死信队列到死信交换机 @Bean public Binding examDlxBinding(Queue examDlxQueue, DirectExchange dlxExchange) { return BindingBuilder.bind(examDlxQueue).to(dlxExchange).with("exam"); } // 绑定会议死信队列到死信交换机 @Bean public Binding meetDlxBinding(Queue meetDlxQueue, DirectExchange dlxExchange) { return BindingBuilder.bind(meetDlxQueue).to(dlxExchange).with("meet"); } @Bean public RabbitTemplate rabbitTemplate() { RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory); // 设置回退回调,只能全局设置一个 rabbitTemplate.setReturnCallback((message, replyCode, replyText, exchange, routingKey) -> { log.error("消息发送失败,目标交换机:{},路由:{},错误信息:{}", exchange, routingKey, replyText); }); // 设置确认回调,全局设置一个,根据关联数据(CorrelationData)进行对应处理 rabbitTemplate.setConfirmCallback((correlationData, ack, cause) -> { if (ack) { MyCorrelationData myCorrelationData = (MyCorrelationData) correlationData; System.out.println(myCorrelationData); // 成功 log.info("消息成功发送到交换机"); } else { // 失败 // todo 根据消息不同,处理不同 log.error("消息发送失败"); } }); return rabbitTemplate; } }