1.maven相关依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2.配置
# RabbitMQ配置 spring.rabbitmq.host=192.168.77.130 spring.rabbitmq.port=5672 # 虚拟主机配置 spring.rabbitmq.virtual-host=/ # 开启发送端消息抵达Broker确认 spring.rabbitmq.publisher-confirms=true # 开启发送端消息抵达Queue确认 spring.rabbitmq.publisher-returns=true # 只要消息抵达Queue,就会异步发送优先回调returnfirm spring.rabbitmq.template.mandatory=true # 手动ack消息,不使用默认的消费端确认 spring.rabbitmq.listener.simple.acknowledge-mode=manual
3.MyRabbitConfig配置
import org.springframework.amqp.rabbit.connection.ConnectionFactory; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter; import org.springframework.amqp.support.converter.MessageConverter; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; @Configuration public class MyRabbitConfig { private RabbitTemplate rabbitTemplate; @Primary @Bean public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) { RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory); this.rabbitTemplate = rabbitTemplate; rabbitTemplate.setMessageConverter(messageConverter()); initRabbitTemplate(); return rabbitTemplate; } @Bean public MessageConverter messageConverter() { return new Jackson2JsonMessageConverter(); } /** * 定制RabbitTemplate * 1、服务收到消息就会回调 * 1、spring.rabbitmq.publisher-confirms: true * 2、设置确认回调 * 2、消息正确抵达队列就会进行回调 * 1、spring.rabbitmq.publisher-returns: true * spring.rabbitmq.template.mandatory: true * 2、设置确认回调ReturnCallback * * 3、消费端确认(保证每个消息都被正确消费,此时才可以broker删除这个消息) * */ @PostConstruct //MyRabbitConfig对象创建完成以后,执行这个方法 public void initRabbitTemplate() { /** * 1、只要消息抵达Broker就ack=true * correlationData:当前消息的唯一关联数据(这个是消息的唯一id) * ack:消息是否成功收到 * cause:失败的原因 */ //设置确认回调 rabbitTemplate.setConfirmCallback((correlationData,ack,cause) -> { System.out.println("confirm...correlationData["+correlationData+"]==>ack:["+ack+"]==>cause:["+cause+"]"); }); /** * 只要消息没有投递给指定的队列,就触发这个失败回调 * message:投递失败的消息详细信息 * replyCode:回复的状态码 * replyText:回复的文本内容 * exchange:当时这个消息发给哪个交换机 * routingKey:当时这个消息用哪个路邮键 */ rabbitTemplate.setReturnCallback((message,replyCode,replyText,exchange,routingKey) -> { System.out.println("Fail Message["+message+"]==>replyCode["+replyCode+"]" + "==>replyText["+replyText+"]==>exchange["+exchange+"]==>routingKey["+routingKey+"]"); }); } }
4.MyRabbitConfig
import org.springframework.amqp.core.*; import org.springframework.amqp.rabbit.connection.CorrelationData; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter; import org.springframework.amqp.support.converter.MessageConverter; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.annotation.PostConstruct; import java.util.HashMap; import java.util.Map; @Configuration public class MyRabbitConfig { @Autowired RabbitTemplate rabbitTemplate; @Bean public Queue orderDelayQueue() { Map<String, Object> args = new HashMap<>(); args.put("x-dead-letter-exchange", "order-event-exchange"); args.put("x-dead-letter-routing-key", "order.release.order"); args.put("x-message-ttl", 60000); // 订单状态改变时间要比库存早 return new Queue("order.delay.queue", true, false, false, args); } @Bean public Queue orderReleaseQueue() { return new Queue("order.release.order.queue", true, false, false ); } @Bean public Exchange orderEventExchange() { return new TopicExchange("order-event-exchange", true, false ); } @Bean public Binding orderCreateOrder() { // 交换机根据routing-key绑定队列 return new Binding("order.delay.queue", Binding.DestinationType.QUEUE, "order-event-exchange", "order.create.order", null); } @Bean public Binding orderReleaseOrder() { return new Binding("order.release.order.queue", Binding.DestinationType.QUEUE, "order-event-exchange", "order.release.order", null); } // ware 服务 @Bean public Binding orderReleaseOtherBinding() { return new Binding("stock.release.stock.queue", Binding.DestinationType.QUEUE, "order-event-exchange", "order.release.other.#", null); } // seckill 服务 秒杀开始 @Bean public Queue orderSeckillOrderQueue() { return new org.springframework.amqp.core.Queue("order.seckill.order.queue", true, false, false ); } // 秒杀结束 @Bean public Binding seckillOrderBinding() { // 交换机根据routing-key绑定队列 return new Binding("order.seckill.order.queue", Binding.DestinationType.QUEUE, "order-event-exchange", "order.seckill.order", null); } @PostConstruct // 构造器创建完成后执行该方法 public void initRabbitTemplate() { // 设置确认回调 rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() { /** * 发送端确认:只要消息抵达服务器端,ack就是true * @param correlationData 当前消息的唯一关联数据(消息唯一id) * @param ack 是否确认收到 * @param reason 失败原因 */ @Override public void confirm(CorrelationData correlationData, boolean ack, String reason) { } }); rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() { /** * 发送端确认:只要消息没有投递给指定队列,就出发这个失败回调 * @param message 投递失败的消息详情 * @param i 回复消息状态码 * @param s 回复消息文本内容 * @param s1 to哪个交换机 * @param s2 routing-key */ @Override public void returnedMessage(Message message, int i, String s, String s1, String s2) { } }); } }
浙公网安备 33010602011771号