Fork me on GitHub

spring-boot集成RabbitMQ

前言

消息队列是日常开发中非常常用的工具,当调用方不需要关心执行结果时,你可以使用它来解耦。 本文简单介绍下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。
      
  • 通过浏览器访问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开发中最常用的方式(易于系统解耦、消峰)。更多的使用还是参考官方文档。

-------------本文结束,感谢您的阅读-------------
贵在坚持,如果您觉得本文还不错,不妨打赏一下~
0%