@Configuration
public class MQConfig {
/**
* 發送到該隊列的message會在一段時間後過期進入到delay_process_queue
* 隊列裏所有的message都有統一的失效時間
*/
public final static String DELAY_QUEUE_PER_QUEUE_TTL_NAME = "delay_queue_per_queue_ttl";
final static int QUEUE_EXPIRATION = 10000;
/**
* message失效後進入的隊列,也就是實際的消費隊列
*/
final static String DELAY_PROCESS_QUEUE_NAME = "delay_process_queue";
/**
* DLX
*/
final static String DELAY_EXCHANGE_NAME = "delay_exchange";
/**
* 路由到delay_queue_per_queue_ttl的exchange
*/
public final static String PER_QUEUE_TTL_EXCHANGE_NAME = "per_queue_ttl_exchange";
@Bean
public ConnectionFactory connectionFactory() {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory("192.168.10.151");
connectionFactory.setUsername("myc");
connectionFactory.setPassword("myc");
// connectionFactory.setPublisherConfirms(true);
return connectionFactory;
}
@Bean
public AmqpAdmin amqpAdmin() {
return new RabbitAdmin(connectionFactory());
}
@Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public RabbitTemplate amqpTemplate() {
RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory());
return rabbitTemplate;
}
/**
* 創建DLX exchangedelayQueuePerMessageTTL
*
* @return
*/
@Bean
DirectExchange delayExchange() {
return new DirectExchange(DELAY_EXCHANGE_NAME);
}
/**
* 創建per_queue_ttl_exchange
*
* @return
*/
@Bean
DirectExchange perQueueTTLExchange() {
return new DirectExchange(PER_QUEUE_TTL_EXCHANGE_NAME);
}
/**
* 創建delay_queue_per_queue_ttl隊列
*
* @return
*/
@Bean
Queue delayQueuePerQueueTTL() {
return QueueBuilder.durable(DELAY_QUEUE_PER_QUEUE_TTL_NAME)
.withArgument("x-dead-letter-exchange", DELAY_EXCHANGE_NAME) // DLX
.withArgument("x-dead-letter-routing-key", DELAY_PROCESS_QUEUE_NAME) // dead letter攜帶的routing key
.withArgument("x-message-ttl", QUEUE_EXPIRATION) // 設置隊列的過期時間
.build();
}
/**
* 創建delay_process_queue隊列,也就是實際消費隊列
*
* @return
*/
@Bean
Queue delayProcessQueue() {
return QueueBuilder.durable(DELAY_PROCESS_QUEUE_NAME)
.build();
}
/**
* 將DLX綁定到實際消費隊列
*
* @param delayProcessQueue
* @param delayExchange
* @return
*/
@Bean
Binding dlxBinding(Queue delayProcessQueue, DirectExchange delayExchange) {
return BindingBuilder.bind(delayProcessQueue)
.to(delayExchange)
.with(DELAY_PROCESS_QUEUE_NAME);
}
/**
* 將per_queue_ttl_exchange綁定到delay_queue_per_queue_ttl隊列
*
* @param delayQueuePerQueueTTL
* @param perQueueTTLExchange
* @return
*/
@Bean
Binding queueTTLBinding(Queue delayQueuePerQueueTTL, DirectExchange perQueueTTLExchange) {
return BindingBuilder.bind(delayQueuePerQueueTTL)
.to(perQueueTTLExchange)
.with(DELAY_QUEUE_PER_QUEUE_TTL_NAME);
}
消息的生產者:
amqpTemplate.convertAndSend(MQConfig.PER_QUEUE_TTL_EXCHANGE_NAME, MQConfig.DELAY_QUEUE_PER_QUEUE_TTL_NAME, "aa");