SpringBoot整合RabbitMQ
- 引入jar包
<!--rabbitmq-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
- 配置yml
spring:
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
- 配置消费者分为三步(直连模式direct)
@Configuration
public class DirectRabbitConfig {
//队列 起名:TestDirectQueue
@Bean
public Queue TestDirectQueue() {
// durable:是否持久化,默认是false,持久化队列:会被存储在磁盘上,当消息代理重启时仍然存在,暂存队列:当前连接有效
// exclusive:默认也是false,只能被当前创建的连接使用,而且当连接关闭后队列即被删除。此参考优先级高于durable
// autoDelete:是否自动删除,当没有生产者或者消费者使用此队列,该队列会自动删除。
// return new Queue("TestDirectQueue",true,true,false);
//一般设置一下队列的持久化就好,其余两个就是默认false
return new Queue("TestDirectQueue",true);
}
@Bean
public Queue TestDirectQueueNext() {
// durable:是否持久化,默认是false,持久化队列:会被存储在磁盘上,当消息代理重启时仍然存在,暂存队列:当前连接有效
// exclusive:默认也是false,只能被当前创建的连接使用,而且当连接关闭后队列即被删除。此参考优先级高于durable
// autoDelete:是否自动删除,当没有生产者或者消费者使用此队列,该队列会自动删除。
// return new Queue("TestDirectQueue",true,true,false);
//一般设置一下队列的持久化就好,其余两个就是默认false
return new Queue("TestDirectQueue2",true);
}
//Direct交换机 起名:TestDirectExchange
@Bean
DirectExchange TestDirectExchange() {
//根据不同类型new不同的交换机
return new DirectExchange("TestDirectExchange",true,false);
}
@Bean
DirectExchange lonelyDirectExchange() {
return new DirectExchange("lonelyDirectExchange",true,false);
}
//绑定 将队列和交换机绑定, 并设置用于匹配键:TestDirectRouting
@Bean
Binding bindingProducerDirect() {
return BindingBuilder.bind(TestDirectQueue()).to(TestDirectExchange()).with("TestDirectRouting");
}
//绑定 将队列和交换机绑定, 并设置用于匹配键:TestDirectRouting
@Bean
Binding bindingProducerDirectNext() {
return BindingBuilder.bind(TestDirectQueueNext()).to(TestDirectExchange()).with("TestDirectRouting");
}
}
- 消费者(设置监听器)
@Component
public class DirectReceiver {
@RabbitHandler
@RabbitListener(queues = "TestDirectQueue") //监听的队列名称
public void process(Map testMessage) {
System.out.println("TestDirectQueue队列 DirectReceiver消费者收到消息 : " + testMessage.toString());
}
@RabbitHandler
@RabbitListener(queues = "TestDirectQueue2") //监听的队列名称
public void process2(Map testMessage) {
System.out.println("TestDirectQueue2队列 DirectReceiver消费者收到消息 : " + testMessage.toString());
}
}
- 消费者(通配符模式Topic)
@Configuration
public class TopicRabbitConfig {
//绑定键
public final static String man = "topic.man";
public final static String woman = "topic.woman";
@Bean
public Queue firstQueue() {
return new Queue(TopicRabbitConfig.man);
}
@Bean
public Queue secondQueue() {
return new Queue(TopicRabbitConfig.woman);
}
@Bean
TopicExchange exchange() {
return new TopicExchange("topicExchange");
}
//将firstQueue和topicExchange绑定,而且绑定的键值为topic.man
//这样只要是消息携带的路由键是topic.man,才会分发到该队列
@Bean
Binding bindingExchangeMessage() {
return BindingBuilder.bind(firstQueue()).to(exchange()).with(man);
}
//将secondQueue和topicExchange绑定,而且绑定的键值为用上通配路由键规则topic.#
// 这样只要是消息携带的路由键是以topic.开头,都会分发到该队列
@Bean
Binding bindingExchangeMessage2() {
return BindingBuilder.bind(secondQueue()).to(exchange()).with("topic.#");
}
}
- 消费者(监听器)
@Component
public class TopicManReceiver {
@RabbitHandler
@RabbitListener(queues = "topic.man")
public void process(Map testMessage) {
System.out.println("topic.man队列 TopicManReceiver消费者收到消息 : " + testMessage.toString());
}
@RabbitHandler
@RabbitListener(queues = "topic.woman")
public void process1(Map testMessage) {
System.out.println("topic.woman队列 TopicManReceiver消费者收到消息 : " + testMessage.toString());
}
}
直连模式测试用例
/**
* 路由发送消息
* @param message
* @return
*/
public Boolean setMessage(String message) {
String messageId = String.valueOf(UUID.randomUUID());
String messageData = message;
String createTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
Map<String, Object> map = new HashMap<>();
map.put("messageId", messageId);
map.put("messageData", messageData);
map.put("createTime", createTime);
//将消息携带绑定键值:TestDirectRouting 发送到交换机TestDirectExchange
rabbitTemplate.convertAndSend("TestDirectExchange", "TestDirectRouting", map);
return true;
}
测试结果:
通配符测试:
/**
* 通配符
* @param message
* @return
*/
public boolean setTopicMessage(String message) {
String messageId = String.valueOf(UUID.randomUUID());
String messageData = message;
String createTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
Map<String, Object> map = new HashMap<>();
map.put("messageId", messageId);
map.put("messageData", messageData);
map.put("createTime", createTime);
rabbitTemplate.convertAndSend("topicExchange", "topic.man", map);
return true;
}
测试结果
这里要非常注意:消费者发送的消息类型是什么就应该监听什么类型的消息
发送方
接收方
持续更新中!