1 packagecom.tuohang.platform.config;2
3 importorg.springframework.amqp.core.Binding;4 importorg.springframework.amqp.core.BindingBuilder;5 importorg.springframework.amqp.core.DirectExchange;6 importorg.springframework.amqp.core.Queue;7 importorg.springframework.amqp.core.QueueBuilder;8 importorg.springframework.amqp.rabbit.connection.ConnectionFactory;9 importorg.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer;10 importorg.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter;11 importorg.springframework.context.annotation.Bean;12 importorg.springframework.context.annotation.Configuration;13
14
15 /**
16 * rabbitMQ的队列设置(生产者发送的消息,永远是先进入exchange,再通过路由,转发到队列)17 *18 *19 *@authorAdministrator20 *@version1.021 * @Date 2018年9月18日22 */
23 @Configuration24 public classOrderQueueConfig {25
26 /**
27 * 订单缓冲交换机名称28 */
29 public final static String ORDER_PRE_EXCHANGE_NAME = "order_pre_exchange";30
31 /**
32 * 发送到该队列的message会在一段时间后过期进入到order_delay_process_queue 【队列里所有的message都有统一的失效时间】33 */
34 public final static String ORDER_PRE_TTL_DELAY_QUEUE_NAME = "order_pre_ttl_delay_queue";35
36 /**
37 * 订单的交换机DLX 名字38 */
39 final static String ORDER_DELAY_EXCHANGE_NAME = "order_delay_exchange";40
41 /**
42 * 订单message时间过期后进入的队列,也就是订单实际的消费队列43 */
44 public final static String ORDER_DELAY_PROCESS_QUEUE_NAME = "order_delay_process_queue";45
46 /**
47 * 订单在缓冲队列过期时间(毫秒)30分钟48 */
49 public final static int ORDER_QUEUE_EXPIRATION = 1800000;50
51 /**
52 * 订单缓冲交换机53 *54 *@return
55 */
56 @Bean57 publicDirectExchange preOrderExange() {58 return newDirectExchange(ORDER_PRE_EXCHANGE_NAME);59 }60
61 /**
62 * 创建order_per_ttl_delay_queue队列,订单消息经过缓冲交换机,会进入该队列63 *64 *@return
65 */
66 @Bean67 publicQueue delayQueuePerOrderTTLQueue() {68 returnQueueBuilder.durable(ORDER_PRE_TTL_DELAY_QUEUE_NAME)69 .withArgument("x-dead-letter-exchange", ORDER_DELAY_EXCHANGE_NAME) //DLX
70 .withArgument("x-dead-letter-routing-key", ORDER_DELAY_PROCESS_QUEUE_NAME) //dead letter携带的routing key
71 .withArgument("x-message-ttl", ORDER_QUEUE_EXPIRATION) //设置订单队列的过期时间
72 .build();73 }74
75 /**
76 * 将order_pre_exchange绑定到order_pre_ttl_delay_queue队列77 *78 *@paramdelayQueuePerOrderTTLQueue79 *@parampreOrderExange80 *@return
81 */
82 @Bean83 publicBinding queueOrderTTLBinding(Queue delayQueuePerOrderTTLQueue, DirectExchange preOrderExange) {84 returnBindingBuilder.bind(delayQueuePerOrderTTLQueue).to(preOrderExange).with(ORDER_PRE_TTL_DELAY_QUEUE_NAME);85 }86
87 /**
88 * 创建订单的DLX exchange89 *90 *@return
91 */
92 @Bean93 publicDirectExchange delayOrderExchange() {94 return newDirectExchange(ORDER_DELAY_EXCHANGE_NAME);95 }96
97 /**
98 * 创建order_delay_process_queue队列,也就是订单实际消费队列99 *100 *@return
101 */
102 @Bean103 publicQueue delayProcessOrderQueue() {104 returnQueueBuilder.durable(ORDER_DELAY_PROCESS_QUEUE_NAME).build();105 }106
107 /**
108 * 将DLX绑定到实际消费队列109 *110 *@paramdelayProcessOrderQueue111 *@paramdelayExchange112 *@return
113 */
114 @Bean115 publicBinding dlxOrderBinding(Queue delayProcessOrderQueue, DirectExchange delayOrderExchange) {116 returnBindingBuilder.bind(delayProcessOrderQueue).to(delayOrderExchange).with(ORDER_DELAY_PROCESS_QUEUE_NAME);117 }118
119 /**
120 * 监听订单实际消费者队列order_delay_process_queue121 *122 *@paramconnectionFactory123 *@paramprocessReceiver124 *@return
125 */
126 @Bean127 publicSimpleMessageListenerContainer orderProcessContainer(ConnectionFactory connectionFactory,128 OrderProcessReceiver processReceiver) {129 SimpleMessageListenerContainer container = newSimpleMessageListenerContainer();130 container.setConnectionFactory(connectionFactory);131 container.setQueueNames(ORDER_DELAY_PROCESS_QUEUE_NAME); //监听order_delay_process_queue
132 container.setMessageListener(newMessageListenerAdapter(processReceiver));133 returncontainer;134 }135 }