前言
消息队列是日常开发中非常常用的工具,当调用方不需要关心执行结果时,你可以使用它来解耦。 本文简单介绍下spring-boot中快速使用RabbitMQ完成队列的发送与消费。
AMQP
AMQP协议
AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。
消息代理
消息代理(message brokers)从发布者(publishers)亦称生产者(producers)那儿接收消息,并根据既定的路由规则把接收到的消息发送给处理消息的消费者(consumers)。
由于AMQP是一个网络协议,所以这个过程中的发布者,消费者,消息代理 可以存在于不同的设备上。
AMQP协议模型
这里推荐直接查看 AMQP 0-9-1 模型解析。
RabbitMQ与AMQP的关系
RabbitMQ
采用Erlang
语言开发。是AMQP
协议的一个实现。
安装rabbitMQ
根据RabbitMQ文档 Installing on Debian and Ubuntu进行安装。
Windows安装
一. 下载并安装Erlang。官网下载页:http://www.erlang.org/downloads
。
二. 下载并安装RabbitMQ。官网下载页:https://www.rabbitmq.com/download.html
。安装完成后会自动注册到服务中启动。
Mac OS X安装
一. 安装Erlang,执行命令:brew install erlang
。
二. 安装RabbitMQ,执行命令:brew install rabbitmq
。
Ubuntu安装
一. 安装Erlang,执行命令:apt-get install erlang erlang-nox
。
二. 在系统中加入RabbitMQ apt 仓库:
echo 'deb http://www.rabbitmq.com/debian/ testing main' | sudo tee /etc/apt/sources.list.d/rabbitmq.list
三. 添加signing key,执行命令:
wget -O- https://www.rabbitmq.com/rabbitmq-release-signing-key.asc | sudo apt-key add -。
四. 更新APT仓库的package list,执行命令:apt-get update
五. 安装Rabbit Server,执行命令:apt-get install rabbitmq-server
。
web控制台
RabbitMQ内置提供了Web管理插件。
- 开启RabbitMQ web管理
- Windows系统:进入插件目录:
D:\rabbitmq\rabbitmq_server-3.7.7\sbin
,运行命令:rabbitmq-plugins.bat enable rabbitmq_management
- Linux和Mac系统: 运行命令:
rabbitmq-plugins enable rabbitmq_management。
- Windows系统:进入插件目录:
- 通过浏览器访问web管理界面:
http://localhost:15672/
,默认登录用户:guest
,密码:guest
。
spring-boot中使用RabbitMQ
三步完成集成:
- maven依赖
- 配置RabbitMQ
- 代码使用及测试
maven依赖
仅需添加
<!-- amqp,用于支持RabbitMQ -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
配置rabbitMQ
配置非常简单,在application.yml
添加rabbitMQ相关:
# rabbitMQ
spring:
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
代码中使用及测试
一. 在配置类中创建一个hello
队列:
@Configuration
public class MessageQueueConfig {
@Bean
public org.springframework.amqp.core.Queue helloQueueByRabbitMQ() {
return new org.springframework.amqp.core.Queue("hello");
}
}
二. 消息推送端,向hello
队列发送一条消息:
@Component
@Slf4j
public class HelloRabbitMQSender {
@Autowired
private AmqpTemplate rabbitTemplate;
public void send(String content) {
log.info("RabbitMQ send : {}", content);
this.rabbitTemplate.convertAndSend("hello", content);
}
}
三. 消息消费端,消费一条hello
队列里的消息:
@Component
@RabbitListener(queues = "hello")
@Slf4j
public class HelloRabbitMQConsumer {
@RabbitHandler
public void process(String hello) {
log.info("RabbitMQ receiver : {}", hello);
}
}
四. 单元测试发送一条消息:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = App.class)
public class HelloRabbitMQSenderTest {
@Autowired
private HelloRabbitMQSender sender;
@Test
public void sendHello() {
sender.send("Hello " + new Date());
}
}
输出结果,可以确认消息发送并且被消费了:
2018-07-16 14:23:09.844 [main] INFO com.crw.mq.HelloRabbitMQSender - RabbitMQ send : Hello Mon Jul 16 14:23:09 CST 2018
2018-07-16 14:23:09.872 [SimpleAsyncTaskExecutor-1] INFO com.crw.mq.HelloRabbitMQConsumer - RabbitMQ receiver : Hello Mon Jul 16 14:23:09 CST 2018
这里仅仅简单介绍了使用RabbitMQ基于队列完成简单的点对点的使用,这也是在web开发中最常用的方式(易于系统解耦、消峰)。更多的使用还是参考官方文档。