知识储备: 

关于消息队列的基本概念我已经在上一篇文章介绍过了(传送门),本篇文章主要讲述的是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. poj - 3585(二次扫描与换根法)

    周末牛客挂了个更难的,这个简单一些 #include<iostream> #include<cstring> #include<cstdio> #include&l ...

  2. HashMap 原理解析

    HashMap是由数组加链表的结合体.如下图: 图中可以看出HashMap底层就是一个数组结构,每个数组中又存储着链表(链表的引用) JDK1.6实现hashmap的方式是采用位桶(数组)+链表的方式 ...

  3. SpringBoot Starter机制 - 自定义Starter

    目录 前言 1.起源 2.SpringBoot Starter 原理 3.自定义 Starter 3.1 创建 Starter 3.2 测试自定义 Starter 前言         最近在学习Sp ...

  4. 数据导出至excle

    ASP.NET MVC导出Excel 首先下载  NPOI.dll 引用到项目中 建议下载地址:http://download.csdn.net/detail/pukuimin1226/5851747 ...

  5. SpringBoot项目的代理机制【一】

    这是了解Spring代理机制的第一篇,尝试了解Spring如何实现Bean的注册和代理.这篇文章会抛出问题:Spring注册Bean,都会用Jdk代理或cglib创建代理对象吗? 1 项目准备 1.1 ...

  6. 【转】Hive Data Manipulation Language

    Hive Data Manipulation Language Hive Data Manipulation Language Loading files into tables Syntax Syn ...

  7. Spring HTTP invoker简介

    Spring HTTP invoker简介 Spring HTTP invoker是spring框架中的一个远程调用模型,执行基于HTTP的远程调用(意味着可以通过防火墙),并使用java的序列化机制 ...

  8. 【转】Java集合框架面试问题集锦

    Java集合框架(例如基本的数据结构)里包含了最常见的Java常见面试问题.很好地理解集合框架,可以帮助你理解和利用Java的一些高级特性.下面是面试Java核心技术的一些很实用的问题. Q:最常见的 ...

  9. 【转】提升你的Java应用性能:改善数据处理

    提升你的Java应用性能:改善数据处理 作者:贾小骏  发布于07月26日 10:17 许多应用程序在压力测试阶段或在生产环境中都会遇到性能问题.如果我们看一下性能问题背后的原因,会发现很多是由数据处 ...

  10. Airbnb如何应用AARRR策略成为全球第一民宿平台

    案例背景 基于房东和租客的痛点构建短租平台,但困于缓慢增长 2007年,住在美国旧金山的两位设计师——BrianChesky与Joe Gebbia正在为他们付不起房租而困扰.为了赚点外块,他们计划将阁 ...