以前我有一系列关于RabbitMQ文章介绍了RabbitMQ的用法,本篇咱们介绍如何在Spring Boot中集成RabbitMQ。本篇主要内容以下:java
工程名称:rabbitmqgit
须要在咱们的工程中的pom.xml引入新jargithub
<!-- spring boot: 此版本使用的amqp-client的4.x版本,全部须要注释掉上面的amqp-client配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
配置application-boot.ymlweb
spring:
# 配置rabbitMQspring:
rabbitmq:
host: 10.240.80.134
username: spring-boot
password: spring-boot
virtual-host: spring-boot-vhost
下面的代码都在这个工程中spring
@Configuration
public class RabbitConfigure2 {
// 队列名称
public final static String SPRING_BOOT_QUEUE = "spring-boot-queue-2";
// 交换机名称
public final static String SPRING_BOOT_EXCHANGE = "spring-boot-exchange-2";
// 绑定的值
public static final String SPRING_BOOT_BIND_KEY = "spring-boot-bind-key-2";
}
在spring boot默认会生成AmqpAdmin和AmqpTemplate 供咱们和RabbitMQ交互。
AmqpTemplate 的默认实例是RabbitTemplate,AmqpAdmin 默认实例是RabbitAdmin,经过源码发现其内部实现实际是RabbitTemplate。因此AmqpAdmin和AmqpTemplate二者本质是相同的app
发送者代码:SendMsg2 svg
@Component
public class SendMsg2 {
// 此接口默认实现只有一个,且是RabbitAdmin,经过源码发现其内部实现实际是RabbitTemplate。因此AmqpAdmin和AmqpTemplate当前二者本质是相同的
@Autowired
private AmqpAdmin amqpAdmin;
// 此接口的默认实现是RabbitTemplate,目前只有一个实现,
@Autowired
private AmqpTemplate amqpTemplate;
/** * 发送消息 * * @param msgContent */
public void send_2(String msgContent) {
amqpTemplate.convertAndSend(RabbitConfigure2.SPRING_BOOT_EXCHANGE, RabbitConfigure2.SPRING_BOOT_BIND_KEY, msgContent);
}
}
经过@RabbitListener注解要接收消息的方法,在此注解中能够定义spring-boot
接收者代码:ReceiveMsg2测试
@Component
public class ReceiveMsg2 {
/** * === 在RabbitMQ上建立queue,exchange,binding 方法二:直接在@RabbitListener声明 begin === * 接收 * @param content */
@RabbitListener(containerFactory = "rabbitListenerContainerFactory",
bindings = @QueueBinding(
value = @Queue(value = RabbitConfigure2.SPRING_BOOT_QUEUE+"3", durable = "true", autoDelete="true"),
exchange = @Exchange(value = RabbitConfigure2.SPRING_BOOT_EXCHANGE, type = ExchangeTypes.TOPIC),
key = RabbitConfigure2.SPRING_BOOT_BIND_KEY)
)
public void receive_2(String content) {
// ...
System.out.println("[ReceiveMsg-2] receive msg: " + content);
}
}
启动类:SpringBootRabbitApplication2
测试类:SimpleTest2ui
@RunWith(SpringRunner.class)
@SpringBootTest(classes= SpringBootRabbitApplication2.class, value = "spring.profiles.active=boot")
public class SimpleTest2 {
@Autowired
private ReceiveMsg2 receiveMsg2;
@Autowired
private SendMsg2 sendMsg2;
@Test
public void sendAndReceive_2(){
String testContent = "send msg via spring boot -2";
sendMsg2.send_2(testContent);
try {
Thread.sleep(1000 * 10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
输出结果
[ReceiveMsg-2] receive msg: send msg via spring boot -2
在第一个例子中咱们在@RabbitListener注解上声明队列、交换机、绑定关系,这里咱们使用@Bean来声明这张对象。详细见RabbitConfigure1
@Configuration
public class RabbitConfigure1 {
// 队列名称
public final static String SPRING_BOOT_QUEUE = "spring-boot-queue-1";
// 交换机名称
public final static String SPRING_BOOT_EXCHANGE = "spring-boot-exchange-1";
// 绑定的值
public static final String SPRING_BOOT_BIND_KEY = "spring-boot-bind-key-1";
// === 在RabbitMQ上建立queue,exchange,binding 方法一:经过@Bean实现 begin ===
/** * 定义队列: * @return */
@Bean
Queue queue() {
return new Queue(SPRING_BOOT_QUEUE, false);
}
/** * 定义交换机 * @return */
@Bean
TopicExchange exchange() {
return new TopicExchange(SPRING_BOOT_EXCHANGE);
}
/** * 定义绑定 * @param queue * @param exchange * @return */
@Bean
Binding binding(Queue queue, TopicExchange exchange) {
return BindingBuilder.bind(queue).to(exchange).with(SPRING_BOOT_BIND_KEY );
}
接收类,仍是使用@RabbitListener,可是只须要配置queues ,queues 除了支持彻底匹配还支持正则匹配
消息接收类:ReceiveMsg1
@Component
public class ReceiveMsg1 {
/** * 获取信息: * queue也能够支持RabbitMQ中对队列的模糊匹配 * @param content */
@RabbitListener(queues = RabbitConfigure1.SPRING_BOOT_QUEUE)
public void receive_1(String content) {
// ...
System.out.println("[ReceiveMsg-1] receive msg: " + content);
}
}
SimpleTest
输出
[ReceiveMsg-1] receive msg: send msg via spring boot - 1
以前的例子里,咱们不管发送和接收消息,消息内容都是使用String,这里咱们能够经过设置MessageConverter设置发送和接收消息的内容的方法参数是对象。
MsgContent1和MsgContent2最简单的POJO类,只有私有属性和set/get方法
和上一个demo相似,除了使用@Bean声明队列、交换机、绑定关系外,还多了方法jackson2JsonMessageConverter()初始化MessageConverter ,此对象会被注入到RabbitListenerContainer容器中,用于转化发送和收到的消息
@Configuration
public class RabbitMsgConvertConfigure {
/** * 定义消息转换实例 * @return */
@Bean
MessageConverter jackson2JsonMessageConverter() {
return new Jackson2JsonMessageConverter();
}
….
}
发送消息,这里直接发送对象
消息发送者:SendMsgConvertMsg
@Component
public class SendMsgConvertMsg {
@Autowired
private AmqpTemplate amqpTemplate;
/** * 发送消息 * * @param msgContent */
public void sendMsgContent1(MsgContent1 msgContent) {
amqpTemplate.convertAndSend(RabbitMsgConvertConfigure.SPRING_BOOT_EXCHANGE, RabbitMsgConvertConfigure.SPRING_BOOT_BIND_KEY, msgContent );
}
/** * 发送消息 * @param msgContent */
public void sendMsgContent2(MsgContent2 msgContent) {
amqpTemplate.convertAndSend(RabbitMsgConvertConfigure.SPRING_BOOT_EXCHANGE, RabbitMsgConvertConfigure.SPRING_BOOT_BIND_KEY, msgContent);
}
}
@RabbitListener定义在类表示此类是消息监听者并设置要监听的队列
@RabbitHandler:在类中能够定义多个@RabbitHandler,spring boot会根据不一样参数传送到不一样方法处理
消息接收者:ReceiveMsgConvertMsg
@Component
// @RabbitListener除了能够做用在方法,也能够做用在类上。在后者的状况下,须要在处理的方法使用@RabbitHandler。一个类能够配置多个@RabbitHandler
@RabbitListener(queues = RabbitMsgConvertConfigure.SPRING_BOOT_QUEUE)
public class ReceiveMsgConvertMsg {
/** * 获取信息: * queue也能够支持RabbitMQ中对队列的模糊匹配 * @param content */
@RabbitHandler
public void receiveMsgContent1(MsgContent1 content) {
// ...
System.out.println("[ReceiveMsgConvertMsg-MsgContent1] receive receiveMsgContent1 msg: " + content);
}
@RabbitHandler
public void receiveMsgContent2(MsgContent2 msgContent2) {
// ...
System.out.println("[ReceiveMsgConvertMsg-MsgContent2] receive receiveMsgContent2 msg: " + msgContent2);
}
}
测试类:MsgConvertTest
输出结果
[ReceiveMsgConvertMsg-MsgContent1] receive receiveMsgContent1 msg: [ name = send msg via spring boot - msg convert - MsgContent1; age = 27 ]
[ReceiveMsgConvertMsg-MsgContent2] receive receiveMsgContent2 msg: [ id = 83; content = send msg via spring boot - msg convert - MsgContent1 ]
全部的详细代码见github代码,请尽可能使用tag v0.17,不要使用master,由于master一直在变,不能保证文章中代码和github上的代码一直相同