原文:https://www.jianshu.com/p/e1258c004314

RabbitMQ作为AMQP的代表性产品,在项目中大量使用。结合现在主流的spring boot,极大简化了开发过程中所涉及到的消息通信问题。

首先正确的安装RabbitMQ及运行正常。

RabbitMQ需啊erlang环境,所以首先安装对应版本的erlang,可在RabbitMQ官网下载

  1. # rpm -ivh erlang-19.0.4-1.el7.centos.x86_64.rpm

使用yum安装RabbitMQ,避免缺少依赖包引起的安装失败

  1. # yum install rabbitmq-server-3.6.6-1.el7.noarch.rpm

启动RabbitMQ

  1. # /sbin/service rabbitmq-server start

由于RabbitMQ默认提供的guest用户只能本地访问,所以额外创建用户用于测试

  1. # /sbin/rabbitmqctl add_user test test123
  2. 用户名:test,密码:test123

开启web管理插件

  1. # rabbitmq-plugins enable rabbitmq_management

并使用之前创建的用户登录,并设置该用户为administrator,虚拟主机地址为/

spring boot 引入相关依赖

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-amqp</artifactId>
  5. </dependency>
  6. </dependencies>

消息生产者

application.properties添加一下配置
  1. spring.rabbitmq.host=192.168.1.107
  2. spring.rabbitmq.port=5672
  3. spring.rabbitmq.username=test
  4. spring.rabbitmq.password=test123
  5. spring.rabbitmq.publisher-confirms=true
  6. spring.rabbitmq.publisher-returns=true
  7. spring.rabbitmq.template.mandatory=true
spring boot配置类,作用为指定队列,交换器类型及绑定操作
  1. import org.springframework.amqp.core.Binding;
  2. import org.springframework.amqp.core.BindingBuilder;
  3. import org.springframework.amqp.core.Queue;
  4. import org.springframework.amqp.core.TopicExchange;
  5. import org.springframework.context.annotation.Bean;
  6. import org.springframework.context.annotation.Configuration;
  7. @Configuration
  8. public class RabbitConfig {
  9. //声明队列
  10. @Bean
  11. public Queue queue1() {
  12. return new Queue("hello.queue1", true); // true表示持久化该队列
  13. }
  14. @Bean
  15. public Queue queue2() {
  16. return new Queue("hello.queue2", true);
  17. }
  18. //声明交互器
  19. @Bean
  20. TopicExchange topicExchange() {
  21. return new TopicExchange("topicExchange");
  22. }
  23. //绑定
  24. @Bean
  25. public Binding binding1() {
  26. return BindingBuilder.bind(queue1()).to(topicExchange()).with("key.1");
  27. }
  28. @Bean
  29. public Binding binding2() {
  30. return BindingBuilder.bind(queue2()).to(topicExchange()).with("key.#");
  31. }
  32. }

共声明了2个队列,分别是hello.queue1,hello.queue2,交换器类型为TopicExchange,并与hello.queue1,hello.queue2队列分别绑定。

生产者类
  1. import java.util.UUID;
  2. import javax.annotation.PostConstruct;
  3. import org.springframework.amqp.core.Message;
  4. import org.springframework.amqp.rabbit.core.RabbitTemplate;
  5. import org.springframework.amqp.rabbit.core.RabbitTemplate.ReturnCallback;
  6. import org.springframework.amqp.rabbit.support.CorrelationData;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.stereotype.Component;
  9. @Component
  10. public class Sender implements RabbitTemplate.ConfirmCallback, ReturnCallback {
  11. @Autowired
  12. private RabbitTemplate rabbitTemplate;
  13. @PostConstruct
  14. public void init() {
  15. rabbitTemplate.setConfirmCallback(this);
  16. rabbitTemplate.setReturnCallback(this);
  17. }
  18. @Override
  19. public void confirm(CorrelationData correlationData, boolean ack, String cause) {
  20. if (ack) {
  21. System.out.println("消息发送成功:" + correlationData);
  22. } else {
  23. System.out.println("消息发送失败:" + cause);
  24. }
  25. }
  26. @Override
  27. public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
  28. System.out.println(message.getMessageProperties().getCorrelationIdString() + " 发送失败");
  29. }
  30. //发送消息,不需要实现任何接口,供外部调用。
  31. public void send(String msg){
  32. CorrelationData correlationId = new CorrelationData(UUID.randomUUID().toString());
  33. System.out.println("开始发送消息 : " + msg.toLowerCase());
  34. String response = rabbitTemplate.convertSendAndReceive("topicExchange", "key.1", msg, correlationId).toString();
  35. System.out.println("结束发送消息 : " + msg.toLowerCase());
  36. System.out.println("消费者响应 : " + response + " 消息处理完成");
  37. }
  38. }

要点:

1.注入RabbitTemplate

2.实现RabbitTemplate.ConfirmCallback, RabbitTemplate.ReturnCallback接口(非必须)。
ConfirmCallback接口用于实现消息发送到RabbitMQ交换器后接收ack回调。ReturnCallback接口用于实现消息发送到RabbitMQ交换器,但无相应队列与交换器绑定时的回调。

3.实现消息发送方法。调用rabbitTemplate相应的方法即可。rabbitTemplate常用发送方法有

  1. rabbitTemplate.send(message); //发消息,参数类型为org.springframework.amqp.core.Message
  2. rabbitTemplate.convertAndSend(object); //转换并发送消息。 将参数对象转换为org.springframework.amqp.core.Message后发送
  3. rabbitTemplate.convertSendAndReceive(message) //转换并发送消息,且等待消息者返回响应消息。

针对业务场景选择合适的消息发送方式即可。

消息消费者
application.properties添加一下配置
  1. spring.rabbitmq.host=192.168.1.107
  2. spring.rabbitmq.port=5672
  3. spring.rabbitmq.username=test
  4. spring.rabbitmq.password=test123
  5. spring.rabbitmq.listener.concurrency=2 //最小消息监听线程数
  6. spring.rabbitmq.listener.max-concurrency=2 //最大消息监听线程数
消费者类
  1. import org.springframework.amqp.rabbit.annotation.RabbitListener;
  2. import org.springframework.stereotype.Component;
  3. @Component
  4. public class Receiver {
  5. @RabbitListener(queues = "hello.queue1")
  6. public String processMessage1(String msg) {
  7. System.out.println(Thread.currentThread().getName() + " 接收到来自hello.queue1队列的消息:" + msg);
  8. return msg.toUpperCase();
  9. }
  10. @RabbitListener(queues = "hello.queue2")
  11. public void processMessage2(String msg) {
  12. System.out.println(Thread.currentThread().getName() + " 接收到来自hello.queue2队列的消息:" + msg);
  13. }
  14. }

由于定义了2个队列,所以分别定义不同的监听器监听不同的队列。由于最小消息监听线程数和最大消息监听线程数都是2,所以每个监听器各有2个线程实现监听功能。

要点:

1.监听器参数类型与消息实际类型匹配。在生产者中发送的消息实际类型是String,所以这里监听器参数类型也是String。

2.如果监听器需要有响应返回给生产者,直接在监听方法中return即可。

运行测试

  1. import java.util.Date;
  2. import org.junit.Test;
  3. import org.junit.runner.RunWith;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.boot.test.context.SpringBootTest;
  6. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
  7. import com.sam.demo.rabbitmq.Application;
  8. import com.sam.demo.rabbitmq.sender.Sender;
  9. @RunWith(value=SpringJUnit4ClassRunner.class)
  10. @SpringBootTest(classes = Application.class)
  11. public class RabbitTests {
  12. @Autowired
  13. private Sender sender;
  14. @Test
  15. public void sendTest() throws Exception {
  16. while(true){
  17. String msg = new Date().toString();
  18. sender.send(msg);
  19. Thread.sleep(1000);
  20. }
  21. }
  22. }

输出:

  1. 开始发送消息 : wed mar 29 23:20:52 cst 2017
  2. SimpleAsyncTaskExecutor-1 接收到来自hello.queue2队列的消息:Wed Mar 29 23:20:52 CST 2017
  3. SimpleAsyncTaskExecutor-2 接收到来自hello.queue1队列的消息:Wed Mar 29 23:20:52 CST 2017
  4. 结束发送消息 : wed mar 29 23:20:52 cst 2017
  5. 消费者响应 : WED MAR 29 23:20:52 CST 2017 消息处理完成
  6. ------------------------------------------------
  7. 消息发送成功:CorrelationData [id=340d14e6-cfcc-4653-9f95-29b37d50f886]
  8. 开始发送消息 : wed mar 29 23:20:53 cst 2017
  9. SimpleAsyncTaskExecutor-1 接收到来自hello.queue1队列的消息:Wed Mar 29 23:20:53 CST 2017
  10. SimpleAsyncTaskExecutor-2 接收到来自hello.queue2队列的消息:Wed Mar 29 23:20:53 CST 2017
  11. 结束发送消息 : wed mar 29 23:20:53 cst 2017
  12. 消费者响应 : WED MAR 29 23:20:53 CST 2017 消息处理完成
  13. ------------------------------------------------
  14. 消息发送成功:CorrelationData [id=e4e01f89-d0d4-405e-80f0-85bb20238f34]
  15. 开始发送消息 : wed mar 29 23:20:54 cst 2017
  16. SimpleAsyncTaskExecutor-2 接收到来自hello.queue1队列的消息:Wed Mar 29 23:20:54 CST 2017
  17. SimpleAsyncTaskExecutor-1 接收到来自hello.queue2队列的消息:Wed Mar 29 23:20:54 CST 2017
  18. 结束发送消息 : wed mar 29 23:20:54 cst 2017
  19. 消费者响应 : WED MAR 29 23:20:54 CST 2017 消息处理完成
  20. ------------------------------------------------

如果需要使用的其他的交换器类型,spring中都已提供实现,所有的交换器均实现org.springframework.amqp.core.AbstractExchange接口。

常用交换器类型如下:

Direct(DirectExchange):direct 类型的行为是"先匹配, 再投送". 即在绑定时设定一个 routing_key, 消息的routing_key完全匹配时, 才会被交换器投送到绑定的队列中去。

Topic(TopicExchange):按规则转发消息(最灵活)。

Headers(HeadersExchange):设置header attribute参数类型的交换机。

Fanout(FanoutExchange):转发消息到所有绑定队列。

作者:SamHxm
链接:https://www.jianshu.com/p/e1258c004314
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

spring boot集成RabbitMQ的更多相关文章

  1. Spring Boot 集成 RabbitMQ 实战

    Spring Boot 集成 RabbitMQ 实战 特别说明: 本文主要参考了程序员 DD 的博客文章<Spring Boot中使用RabbitMQ>,在此向原作者表示感谢. Mac 上 ...

  2. Spring boot集成RabbitMQ(山东数漫江湖)

    RabbitMQ简介 RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统 MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过读写出 ...

  3. 85. Spring Boot集成RabbitMQ【从零开始学Spring Boot】

    这一节我们介绍下Spring Boot整合RabbitMQ,对于RabbitMQ这里不过多的介绍,大家可以参考网络上的资源进行安装配置,本节重点是告诉大家如何在Spring Boot中使用Rabbit ...

  4. RabbitMQ(3) Spring boot集成RabbitMQ

    springboot集成RabbitMQ非常简单,如果只是简单的使用配置非常少,springboot提供了spring-boot-starter-amqp项目对消息各种支持. 资源代码:练习用的代码. ...

  5. Spring Boot 集成RabbitMQ

    在Spring Boot中整合RabbitMQ是非常容易的,通过在Spring Boot应用中整合RabbitMQ,实现一个简单的发送.接收消息的例子. 首先需要启动RabbitMQ服务,并且add一 ...

  6. spring boot 集成 rabbitmq 指南

    先决条件 rabbitmq server 安装参考 一个添加了 web 依赖的 spring boot 项目 我的版本是 2.5.2 添加 maven 依赖 <dependency> &l ...

  7. spring boot 集成 rabbitmq

    1.使用默认的AmqpTemplate生产消费pojo时,pojo需要implement Serializable,否则会抛出org.springframework.amqp.AmqpExceptio ...

  8. spring boot 集成RabbitMQ的异常

    com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.clos ...

  9. Spring boot集成Rabbit MQ使用初体验

    Spring boot集成Rabbit MQ使用初体验 1.rabbit mq基本特性 首先介绍一下rabbitMQ的几个特性 Asynchronous Messaging Supports mult ...

随机推荐

  1. Maven3核心技术(笔记三)

    第一节:Maven仓库概念 Maven 远程仓库配置文件:$M2_HOME/lib/maven-model-builder-3.3.3.jar 文件:org\apache\maven\model\po ...

  2. js交互

    Js和native交互的方法与问题 实现JS和Native交互有两种方式: 第一种:shouldOverrideUrlLoading(WebView view, String url) 通过给WebV ...

  3. C#基础系列 - 反射基础

    反射用于在程序运行过程中,获取类里面的信息或发现程序集并运行的一个过程.通过反射可以获得.dll和.exe后缀的程序集里面的信息.使用反射可以看到一个程序集内部的类,接口,字段,属性,方法,特性等信息 ...

  4. vue-cli中如何集成UEditor 富文本编辑器?

    1.根据后台语言下载对应的editor插件版本 地址:https://ueditor.baidu.com/website/download.html 2.将下载好的资源放在/static/uedito ...

  5. hdu 3537 翻硬币 每次能翻1个 或2个 或3个

    N 枚硬币排成一排,有的正面朝上,有的反面朝上.我们从左开始对硬币按1 到N 编号. 第一,游戏者根据某些约束翻硬币,但他所翻动的硬币中,最右边那个硬币的必须是从正面翻到反面. 第二,谁不能翻谁输. ...

  6. pytest的参数化测试

    感觉在单元测试当中可能有用, 但在django这种框架中,用途另一说. import pytest import tasks from tasks import Task def test_add_1 ...

  7. html-图片热点和网页划区

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. HTML5移动应用左右滑动touchmove touchmove touchend 实例

    也是刚开始接触移动前端,大虾别喷 <!DOCTYPE HTML> <html> <head> <meta name="viewport" ...

  9. Haproxy 开启日志记录

    CentOS 7上yum安装的Haproxy,默认没有记录日志.需要做一下配置才能记录日志.(不知道其他版本是否需要,已经忘记了)主要是用到了Haproxy,以前貌似没有这么麻烦,今天配置出了一些问题 ...

  10. Django实战(15):Django实现RESTful web service

    曾几何时,Ajax已经统治了Web开发中的客户端,而REST成为web世界中最流行的架构风格(architecture style).所以我们的选择变得很简单:前端ajax访问后端的RESTful w ...