知识储备: 

关于消息队列的基本概念我已经在上一篇文章介绍过了(传送门),本篇文章主要讲述的是SpringBoot与RabbitMQ的整合以及简单的使用。

一.安装RabbitMQ

1.在linux上使用docker下载RabbitMQ

docker pull registry.docker-cn.com/library/rabbitmq:3-management

2.使用docker启动RabbitMQ

docker run -d -p 5672:5672 -p 15672:15672 --name myrabbitmq d69a5113ceae 

5672端口:客户端与MQ的通信端口

15672端口:管理界面访问web页面的端口

3.访问管理界面

浏览器访问:http://172.16.**.**:15672,默认的管理界面账号密码均为:guest

测试RabbitMQ

1). 登录RabbitMQ管理界面,创建交换器(Exchanges)

2). 创建Queues

3). 分别给交换器绑定queues

4).在direct交换器中给路由器发送消息

 

5). 队列中接收到的消息

二.环境搭建

1.引入spring-boot-starter-amqp

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

2.环境配置

#配置主机地址,默认localhost
spring.rabbitmq.host=172.16.80.34
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
#默认5672
spring.rabbitmq.port=5672
#默认/
spring.rabbitmq.virtual-host=/

三.RabbitMQ自动配置原理

1.RabbitAutoConfiguration

2.自动配置了连接工厂ConnectionFactory

3.RabbitProperties封装了RabbitMQ的配置

4.RabbitTemplate:给RabbitMQ发送和接收消息的模板

5.AmqpAdmin系统管理组件:创建交换器等

四.RabbitTemplate的简单使用

发送消息:

@Autowired
RabbitTemplate rabbitTemplate;
@Test
public void contextLoads() { //Message需要自己构造一个,定义消息体内容和消息头
// rabbitTemplate.send(exchange,routingKey,message);
//object默认当成消息体,只需要传入要发送的对象,自动序列化给mq
Map<String,Object> map = new HashMap<>();
map.put("msg","第一次发送消息");
map.put("data",Arrays.asList("<","0.0",">"));
//对象被默认序列化以后发送出去
rabbitTemplate.convertAndSend("exchange.direct","wang.news",map); //使用点对点方式传播
}

此时查看RabbitMQ管理页面的wang.news队列,已经有消息插入进去了,由于RabbitMQ传递的是序列化的对象,所以接收到的值也是序列化过后的值。

接收消息:

 @Test
public void receive(){
Object receive = rabbitTemplate.receiveAndConvert("wang.news"); //接收消息。
System.out.println(receive.getClass());
System.out.println(receive);
}

使用该方法获取到消息后队列里的消息就会自动清除。

由于序列化的对象保存起来很不直观,那么该如何解决这个问题呢?

由于RabbitTemplate默认采用的是JDK的MessageConvert,使用默认的JDK序列化规则,所以需要更改MessageConvert,更改为JSON的序列化规则

import org.springframework.amqp.support.converter.MessageConverter;//这里要导入amqp包下的MessageConverter
@Configuration
public class MyAMQPConfig {
@Bean
public MessageConverter messageConverter(){ //自动配置里,配置RabbitTemplate的时候会判断是否有自定义的MessageConvert,如果有则采用自定义的
return new Jackson2JsonMessageConverter();
} }

上面演示的是点对点(direct)的交换器(Exchanges),那么广播模式(fanout)的交换器要如何使用的呢?

 @Test
public void sendMsgs(){
rabbitTemplate.convertAndSend("exchange.fanout","",new Book("java",2)); //广播模式只需要指定交换器的模式,自动会向该交换器绑定的所有队列发送消息。
}

发布/订阅(模糊匹配模式)也是一样的,只需要指定交换器,修改对应的routingKey就行了

 /**
* 发布/订阅(模糊匹配)方式
*/
@Test
public void topicSendMsgs(){
rabbitTemplate.convertAndSend("exchange.topic","*.news",new Book("python",3));
}

五.监听消息

上面简单演示了使用rabbitTemplate发送和接收消息,实际开发中需要一些监听场景。例如订单系统和库存系统的解耦中,两个系统之间都是通过消息队列来通信的,当某一个人下单之后,将订单信息存放在消息队列中,库存系统要实时的监听消息里面的内容一旦有新的订单进来,库存系统就需要有相关的操作。那么该如何实现监听呢,Spring为了简化开发,引入了一些注解来实现消息队列的监听。

1.在SpringBoot主启动类上加上注解@EnableRabbit,开启RabbitMQ的注解模式

@EnableRabbit//开启基于注解的RabbitMQ模式
@SpringBootApplication
public class Springboot02AmqpApplication { public static void main(String[] args) {
SpringApplication.run(Springboot02AmqpApplication.class, args);
} }

2.使用@RabbitListener监听某个队列

@Service
public class BookService {
@RabbitListener(queues = {"wang.news"}) //监听队列wang.news,只要wang.news收到消息,立刻执行该方法,并清空队列
public void receive(Book book){
System.out.println("收到消息"+book);
}
@RabbitListener(queues = {"wang"})
public void receive02(Message message){ //org.springframework.amqp.core.Message;
System.out.println("消息内容"+message.getBody());
System.out.println("消息头"+message.getMessageProperties());
}
}

五.AMQPAdmin的使用

上面代码用到的交换器以及队列都是我们手动在RabbitMQ管理界面添加的,使用AMQPAdmin可以让我们用编码的方式创建这些组件。

1.创建交换器(Exchange)

  @Test
public void createExchange() {
DirectExchange directExchange = new DirectExchange("amqpadmin.exchange");
amqpAdmin.declareExchange(directExchange); //创建一个DirectExchange
System.out.println("创建完成");
}

2.创建队列(Queue)

 @Test
public void createQueue(){
amqpAdmin.declareQueue(new Queue("amqpadmin.queue",true));
System.out.println("队列创建完成");
}

3.创建绑定规则(banding)

 @Test
public void createBanding(){
amqpAdmin.declareBinding(new Binding("amqpadmin.queue",Binding.DestinationType.QUEUE,"amqpadmin.exchange","amqpadmin.queue",null));
System.out.println("绑定完成");
}

SpringBoot消息篇Ⅲ --- 整合RabbitMQ的更多相关文章

  1. java框架之SpringBoot(12)-消息及整合RabbitMQ

    前言 概述 大多数应用中,可通过消息服务中间件来提升系统异步通信.扩展解耦的能力. 消息服务中两个重要概念:消息代理(message broker)和目的地(destination).当消息发送者发送 ...

  2. spring boot实战(第十二篇)整合RabbitMQ

    前言 最近几篇文章将围绕消息中间件RabbitMQ展开,对于RabbitMQ基本概念这里不阐述,主要讲解RabbitMQ的基本用法.Java客户端API介绍.spring Boot与RabbitMQ整 ...

  3. SpringBoot消息队列之-rabbitMQ

    一.概述 1.在大多应用中,我们系统之间需要进行异步通信,即异步消息. 2.异步消息中两个重要概念:消息代理(message broker)和目的地(destination) 当消息发送者发送消息以后 ...

  4. SpringBoot入门篇--整合mybatis+generator自动生成代码+druid连接池+PageHelper分页插件

    原文链接 我们这一篇博客讲的是如何整合Springboot和Mybatis框架,然后使用generator自动生成mapper,pojo等文件.然后再使用阿里巴巴提供的开源连接池druid,这个连接池 ...

  5. spring 5.x 系列第14篇 —— 整合RabbitMQ (代码配置方式)

    源码Gitub地址:https://github.com/heibaiying/spring-samples-for-all 一.说明 1.1 项目结构说明 本用例关于rabbitmq的整合提供简单消 ...

  6. spring 5.x 系列第13篇 —— 整合RabbitMQ (xml配置方式)

    源码Gitub地址:https://github.com/heibaiying/spring-samples-for-all 一.说明 1.1 项目结构说明 本用例关于rabbitmq的整合提供简单消 ...

  7. springboot 2.0+整合RabbitMQ

    基于spring-boot 2.* 作用: 1.异步处理 2.应用解耦 3.流量削峰   相关概念介绍: Broker:它提供一种传输服务,它的角色就是维护一条从生产者到消费者的路线,保证数据能按照指 ...

  8. SpringBoot检索篇Ⅳ --- 整合ElasticSearch

    知识储备:  关于ElasticSearch的基本使用我已经在上一篇文章介绍过了(传送门),本篇文章主要讲述的是SpringBoot与ElasticSearch的整合使用. SpringBoot与El ...

  9. SpringBoot分布式篇Ⅷ --- 整合SpringCloud

    SpringCloud是一个分布式的整体解决方案.Spring Cloud为开发者提供了在分布式系统(配置管理,服务发现,熔断,路由,微代理,控制总线,一次性token,全局锁,leader选举.分布 ...

随机推荐

  1. javaweb-选课系统

    选课系统中用到了4个表,分别是classs.yonghu.teacher.student.在用户中存放管理员的信息name和password以及id,在另三个表中存放对应的数据如图: calss: t ...

  2. [梁山好汉说IT] 如何理解脑裂问题

    [梁山好汉说IT] 如何理解脑裂问题 这个系列是通过梁山好汉的例子来阐述一些IT概念. 1. 问题描述 Split-brain, 就是在集群环境中,因为异常情况发生后,产生两个子集群.每个子集群都选出 ...

  3. JAVA8之 Stream 流(四)

    如果说前面几章是函数式编程的方法论,那么 Stream 流就应该是 JAVA8 为我们提供的最佳实践. Stream 流的定义 Stream 是支持串行和并行操作的一系列元素.流操作会被组合到流管道中 ...

  4. 深度探索c++对象模型阅读笔记图

  5. 【题解】歌唱王国(概率生成函数+KMP)+伦讲的求方差

    [题解]歌唱王国(概率生成函数+KMP)+伦讲的求方差 生成函数的本质是什么呀!为什么和It-st一样神 设\(f_i\)表示填了\(i\)个时候停下来的概率,\(g_i\)是填了\(i\)个的时候不 ...

  6. 洛谷$P3308\ [SDOI2014]LIS$ 网络流

    正解:网络流 解题报告: 传送门$QwQ$ 恩先不考虑关于那个附加属性的限制,考虑这题怎么做? 首先这题从名字开始就让人忍不住联想起网络流24题里的那个最长不下降子序列?于是同样考虑预处理一个$f$呗 ...

  7. 淘淘购物网Ⅱ——SSM架构搭建

    课程计划 1.SSM框架整合 2.mybatis逆向工程 3.整合测试 4.Debug调试 SSM框架整合 前后台所用的技术 框架:Spring + SpringMVC + Mybatis 前端:Ea ...

  8. 「洛谷P2397」 yyy loves Maths VI (mode) 解题报告

    P2397 yyy loves Maths VI (mode) 题目背景 自动上次redbag用加法好好的刁难过了yyy同学以后,yyy十分愤怒.他还击给了redbag一题,但是这题他惊讶的发现自己居 ...

  9. 浅谈Java三大特性之多态

    目录 一.前言 二.发生的条件 三.多态包含(或者说体现在)两个方面: 四.示例 感谢阅读 一.前言 这篇讲下三大特性之一的多态,可以通俗得去理解,多种形态,多种姿态... 那么在面向对象的程序设计中 ...

  10. jSignature签字板保存为图片

    这是本人的第一篇博客,还不会使用.有些简陋,勿怪! 今天要讲的是使用jquery插件jSignature做一个手写板签字的功能,并将签字笔迹保存为图片. 第一步:环境准备 jquery.jSignat ...