前情提要
本章为RabbitMQ系列第二章,默认读者已经安装完成RabbitMQ。
如果还未安装,可以查看
RabbitMQ 从入门到秃头 1 - Centos7 安装RabbitMQ
总的来说,SpringBoot整合RabbitMQ需要配置的信息非常少,因为SpringBoot本身提供了spring-boot-starter-amqp 的AMQP协议支持的依赖包。
好的,话不多说,马上开始。
导入Maven依赖(生产者和消费者都需要导入)
<!-- Spring整合RabbitMQ核心依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
生产者(Producer)相关
在SpringBoot的核心配置文件Application.yml/properties中配置相关信息(文章使用yml文件)
####################################
#
# RabbitMQ 生产者基本配置信息
#
####################################
spring:
rabbitmq:
addresses: 192.168.153.139:5672 #RabbitMQ默认的端口为5672
username: guest #安装时设置了用户名密码均为guest
password: guest
virtual-host: /
connection-timeout: 20000
publisher-confirms: true #是否需要消息确认
生产者(Producer)核心代码
/**
* 确认消息生产者
* @author Jackie Ke
*/
@Component
public class MessageProducer implements RabbitTemplate.ConfirmCallback{
@Autowired
private RabbitTemplate rabbitTemplate;
/**
* 发送信息的操作
* @param message
*/
public void send(RabbitMessage message) {
if (message == null || message.getExchange() == null || message.getRoutingKey() == null) throw new IllegalArgumentException();
// 1. 添加消息的附加消息
MessageHeaders messageHeaders = new MessageHeaders(message.getProperties());
Message<?> msg = MessageBuilder.createMessage(message, messageHeaders);
// 2. 设置消费者确认消息的函数
rabbitTemplate.setConfirmCallback(this); // 为了方便直接实现ConfirmCallback,传入this即可
// 3. 创建消息的唯一标识
CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
// 4. 设置消息发送完成后的回调函数
MessagePostProcessor messagePostProcessor = new MessagePostProcessor() {
@Override
public org.springframework.amqp.core.Message postProcessMessage(org.springframework.amqp.core.Message message) throws AmqpException {
System.out.println("-------------- 消息发送完成 --------------");
return message;
}
};
// 5. 发送消息
rabbitTemplate.convertAndSend(message.getExchange(), message.getRoutingKey(), msg, messagePostProcessor, correlationData);
}
/**
* @param correlationData 信息的唯一标识,类似ID
* @param ack 是否成功接收
* @param cause 如果失败,返回异常信息
*/
@Override
public void confirm(CorrelationData correlationData, boolean ack, String cause) {
System.out.println("消息发送" + (ack ? "成功" : "失败") + ", correlationData:" + correlationData);
}
}
消费者(Consumer)相关
server:
port: 8081
####################################
#
# RabbitMQ 消费者基本配置信息
#
####################################
spring:
rabbitmq:
addresses: 192.168.153.139:5672 # RabbitMQ默认的端口为5672
username: guest # 安装时设置了用户名密码均为guest
password: guest
virtual-host: /
connection-timeout: 20000
listener: # 消费者核心配置
simple:
acknowledge-mode: manual # 消费消息后,如何确认消息,默认为auto,即自动确认
concurrency: 5
prefetch: 1
max-concurrency: 10
hello: # 此处及以下为项目中需要使用到的配置信息,写在此处方便维护,在项目中使用${}引用
exchange:
name: hello-exchange
durable: true
type: topic
key: springboot.*
queue:
value: queue-hello
消费者(Consumer)核心代码
/**
* 确认消息生产者
* @author Jackie Ke
*/
@Component
public class MessageProducer implements RabbitTemplate.ConfirmCallback{
@Autowired
private RabbitTemplate rabbitTemplate;
/**
* 发送信息的操作
* @param message
*/
public void send(RabbitMessage message) {
if (message == null || message.getExchange() == null || message.getRoutingKey() == null) throw new IllegalArgumentException();
// 1. 添加消息的附加消息
MessageHeaders messageHeaders = new MessageHeaders(message.getProperties());
Message<?> msg = MessageBuilder.createMessage(message, messageHeaders);
// 2. 设置确认消息的函数
rabbitTemplate.setConfirmCallback(this); // 为了方便直接实现ConfirmCallback,传入this即可
// 3. 创建消息的唯一标识
CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
// 4. 设置消息发送完成后的回调函数
MessagePostProcessor messagePostProcessor = new MessagePostProcessor() {
@Override
public org.springframework.amqp.core.Message postProcessMessage(org.springframework.amqp.core.Message message) throws AmqpException {
System.out.println("-------------- 消息发送完成 --------------");
return message;
}
};
// 5. 发送消息
rabbitTemplate.convertAndSend(message.getExchange(), message.getRoutingKey(), msg, messagePostProcessor, correlationData);
}
/**
* @param correlationData 信息的唯一标识,类似ID
* @param ack 是否成功接收
* @param cause 如果失败,返回异常信息
*/
@Override
public void confirm(CorrelationData correlationData, boolean ack, String cause) {
System.out.println("消息发送" + (ack ? "成功" : "失败") + ", correlationData:" + correlationData);
}
}
以上就是核心的配置和代码,接下来进行单元测试,真正发送信息
/**
* 生产者单元测试类
* @author Jackie Ke
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class ProducerTest {
@Autowired
private MessageProducer messageProducer;
@Test
public void testProduce() throws InterruptedException {
RabbitMessage rabbitMessage = new RabbitMessage();
Map<String, Object> properties = new HashMap<>();
properties.put("name", "张三");
properties.put("description", "法外狂徒");
rabbitMessage.setExchange("hello-exchange");
rabbitMessage.setRoutingKey("springboot.rabbit");
rabbitMessage.setContent("Hello RabbitMQ !!!");
rabbitMessage.setProperties(properties);
messageProducer.send(rabbitMessage);
}
}
如果正常运行,单元测试控制台中可以看到
消费者控制台中可以看到
至此,SpringBoot整合RabbitMQ的简易HelloWorld已经完成了。
源码已上传到我的Github上,可以自行下载。
如果文章有任何错误,欢迎指出~
感谢你的阅读,我们下回再见。