1:死信队列配置文件
package com.platform.config; import com.platform.constant.MqConstant; import org.springframework.amqp.core.*; import org.springframework.beans.factory.config.YamlPropertiesFactoryBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; import org.springframework.core.io.ClassPathResource; import java.util.HashMap; import java.util.Map; import static com.platform.constant.MqConstant.UPDATEORDERSTATUSPAYEND; import static com.platform.constant.MqConstant.UPDATEORDERSTATUSPAYENDDIE; import static com.platform.constant.MqConstant.UPDATESTATUSPAYDIEMESSAGE; /** * @author fengdongdong * @date 2019/5/18 */ @Configuration public class RabbitMqConfig { /** * 死信队列 交换机标识符 */ private static final String DEAD_LETTER_QUEUE_KEY = "x-dead-letter-exchange"; /** * 死信队列交换机绑定键标识符 */ private static final String DEAD_LETTER_ROUTING_KEY = "x-dead-letter-routing-key"; /** * 死信队列跟交换机类型没有关系 不一定为directExchange 不影响该类型交换机的特性. * * @return the exchange */ @Bean("deadLetterExchange") public Exchange deadLetterExchange() { return ExchangeBuilder.directExchange("DL_EXCHANGE").durable(true).build(); } /** * 声明一个死信队列. * x-dead-letter-exchange 对应 死信交换机 * x-dead-letter-routing-key 对应 死信队列 * * @return the queue */ @Bean("deadLetterQueue") public Queue deadLetterQueue() { Map<String, Object> args = new HashMap<>(3); // x-dead-letter-exchange 声明 死信交换机 args.put(DEAD_LETTER_QUEUE_KEY, "DL_EXCHANGE"); // x-dead-letter-routing-key 声明 死信路由键 args.put(DEAD_LETTER_ROUTING_KEY, "KEY_R"); //过期时间 args.put("x-message-ttl",2000); return QueueBuilder.durable(UPDATEORDERSTATUSPAYENDDIE).withArguments(args).build(); } /** * 定义死信队列转发队列. * * @return the queue */ @Bean("redirectQueue") public Queue redirectQueue() { return QueueBuilder.durable(UPDATESTATUSPAYDIEMESSAGE).build(); } /** * 死信路由通过 DL_KEY 绑定键绑定到死信队列上. * * @return the binding */ @Bean public Binding deadLetterBinding() { return new Binding(UPDATEORDERSTATUSPAYENDDIE, Binding.DestinationType.QUEUE, "DL_EXCHANGE", "DL_KEY", null); } /** * @return the binding */ @Bean public Binding redirectBinding() { return new Binding(UPDATESTATUSPAYDIEMESSAGE, Binding.DestinationType.QUEUE, "DL_EXCHANGE", "KEY_R", null); } }
2:消息发送
/** * 功能描述 支付完成修改订单状态 * @date 2019/5/17 * @params [params] * @return boolean */ @Override public boolean updateOrderStatusPayEnd(Map<String,Object> params) { try { String s1 = JSONObject.toJSONString(params); amqpTemplate.convertAndSend(MqConstant.UPDATEORDERSTATUSPAYEND, s1); return true; } catch (Exception e) { e.printStackTrace(); return false; } } @Override public boolean updateOrderPayDieLetter(Map<String, Object> param) { try { String s1 = JSONObject.toJSONString(param); MessagePostProcessor messagePostProcessor = message -> { MessageProperties messageProperties = message.getMessageProperties(); // 设置编码 messageProperties.setContentEncoding("utf-8"); // 设置过期时间10*1000毫秒(最终过期时间取x-message-ttl和messageProperties.setExpiration的最小值 messageProperties.setExpiration("100000"); return message; }; amqpTemplate.convertAndSend("DL_EXCHANGE", "DL_KEY", s1, messagePostProcessor); return true; } catch (Exception e) { e.printStackTrace(); return false; } }
3:配置文件
(1)生产者
spring: rabbitmq: host: 10.160.2.240 port: 5672 username: admin password: admin
(2)消费者
spring: application: name: feign-shop-isw rabbitmq: host: 10.160.2.240 port: 5672 username: admin password: admin listener: retry: enabled: true #是否开启消费者重试(为false时关闭消费者重试,这时消费端代码异常会一直重复收到消息) max-attempts: 2 #最大重试次数 initial-interval: 500 #重试间隔时间(单位毫秒) multiplier: 5 #应用于前一重试间隔的乘法器。
3:消费者配置
@Component public class TestMq { /** * 同步订单 * * @param s */ @RabbitHandler @RabbitListener(queues = "updateOrderStatusPayEnd") public void REDIRECT_QUEUE(String s) { System.out.println("DL_QUEUE同步订单数据结果:" + s); } /** * 同步订单 * * @param s */ @RabbitHandler @RabbitListener(queues = "updateStatusPayDieMessage") public void DL_QUEUE(String s) { System.out.println("DL_QUEUE同步订单数据结果-原队列消费成功:" + s); } }