1. 创建队列、交换机
延迟交换机:exchange.delay.someMessage
延迟队列:queue.delay.someMessage
死信交换机:exchange.deadLetter.someMessage
死信队列:queue.deadLetter.someMessage
延迟交换机 与 延迟队列 绑定
死信交换机 与 死信队列 绑定
1.1 注意:创建延迟队列时设置 x-dead-letter-exchange
创建 延迟队列 queue.delay.someMessage
时,设置 x-dead-letter-exchange
的值为 死信交换机
x-dead-letter-exchange = exchange.deadLetter.someMessage
1.2 创建延迟队列时设置 x-message-ttl (可以设置,也可以不设置)
创建 延迟队列 queue.delay.someMessage
时
- 如果延迟队列没设置
x-message-ttl
消息存活时间取消息设置的properties.setExpiration("5000");
有效期5000毫秒
- 如果延迟队列设置了
x-message-ttl
消息存活时间,例如:x-message-ttl = 10000
,消息也设置了有效期properties.setExpiration("5000");
,那么,以两者中较小值5000
有效
2. 生产者
@Autowired
private RabbitTemplate rabbitTemplate;
@PostMapping("/testMQ")
@ResponseBody
public void testMQ(@RequestBody String someMessage) {
rabbitTemplate.setExchange("exchange.delay.someMessage");
rabbitTemplate.setRoutingKey("delayKey");
MessageProperties properties = new MessageProperties();
// 设置有效期,毫秒
properties.setExpiration("5000");
Message message = MessageBuilder
.withBody(someMessage.getBytes())
.andProperties(properties)
.build();
rabbitTemplate.send(message);
}
3. 消费者
@RabbitListener(queues = {"queue.deadLetter.someMessage"})
public void consumer(Message message, Channel channel) {
//推送的消息
String msg = new String(message.getBody());
System.out.println("message:"+msg);
try {
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
} catch (IOException e) {
System.out.println(e);
}
}
4. 其他
MQ配置类
package com.allqj.finance.configuration;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @description: MQ配置类
**/
@Configuration
public class MQConfig {
@Value("${spring.rabbitmq.host}")
private String host;
@Value("${spring.rabbitmq.port}")
private String port;
@Value("${spring.rabbitmq.username}")
private String username;
@Value("${spring.rabbitmq.password}")
private String password;
@Value("${spring.rabbitmq.virtualHost}")
private String virtualHost;
@Bean
public ConnectionFactory connectionFactory(){
CachingConnectionFactory factory = new CachingConnectionFactory();
factory.setUri("amqp://"+username+":"+password+"@"+host+":"+port);
factory.setVirtualHost(virtualHost);
return factory;
}
@Bean
public RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory){
RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory);
return rabbitAdmin;
}
@Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory){
RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
//设置Exchange默认操作的exchange和routingkey
// rabbitTemplate.setExchange("zhihao.direct.exchange");
// rabbitTemplate.setRoutingKey("zhihao.debug");
return rabbitTemplate;
}
}
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit</artifactId>
<version>2.0.2.RELEASE</version>
</dependency>