SpringAMQP简单入门, 使用Docker部署RabbitMQ至服务器
简介:SpringAMQP是基于RabbitMQ封装的一套模板,并且还利用SpringBoot对其实现了自动装配,使用起来非常方便。
SpringAMQP提供了三个功能:
自动声明队列、交换机及其绑定关系
基于注解的监听器模式,异步接收消息
封装了RabbitTemplate工具,用于发送消息
部署rabbitMQ
docker run \
-e RABBITMQ_DEFAULT_USER=remedios \
-e RABBITMQ_DEFAULT_PASS=123456 \
--name rabbitmq \
--hostname rabbitmq1 \
-p 15672:15672 \
-p 5672:5672 \
-d \
rabbitmq:3-management
15672是控制台端口
输入 服务器ip:15672 访问控制台
导入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>
入门案例之消息发送
首先配置MQ地址,在publisher服务的application.yml中添加配置:
spring:
rabbitmq:
host: 192.168.100.101 # 主机名
port: 5672 # 端口
virtual-host: / # 虚拟主机
username: remedios # 用户名
password: 123456 # 密码
然后在publisher服务中编写测试类SpringAmqpTest,并利用RabbitTemplate实现消息发送:
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringAmqpTest {@Autowiredprivate RabbitTemplate rabbitTemplate;@Testpublic void testSimpleQueue() {// 队列名称String queueName = "simple.queue";// 消息String message = "hello, spring amqp!";// 发送消息rabbitTemplate.convertAndSend(queueName, message);}
}
消息接收
在consumer服务的application.yml中添加配置:
spring:
rabbitmq:
host: 192.168.100.101 # 主机名
port: 5672 # 端口
virtual-host: / # 虚拟主机
username: remedios # 用户名
password: 123456 # 密码
然后在consumer服务中新建一个类SpringRabbitListener,代码如下:
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;@Component
public class SpringRabbitListener {@RabbitListener(queues = "simple.queue")public void listenSimpleQueueMessage(String msg) throws InterruptedException {System.out.println("spring 消费者接收到消息:【" + msg + "】");}
}
设置消息处理完才能获取新的消息
spring:
rabbitmq:
listener:
simple:
prefetch: 1 # 每次只能获取一条消息,处理完成才能获取下一个消息
总结
Work模型的使用:
多个消费者绑定到一个队列,同一条消息只会被一个消费者处理
通过设置prefetch来控制消费者预取的消息数量
发布/订阅模型
- Publisher:生产者,也就是要发送消息的程序,但是不再发送到队列中,而是发给X(交换机)
- Exchange:交换机,图中的X。一方面,接收生产者发送的消息。另一方面,知道如何处理消息,例如递交给某个特别队列、递交给所有队列、或是将消息丢弃。到底如何操作,取决于Exchange的类型。Exchange有以下3种类型:
- Fanout:广播,将消息交给所有绑定到交换机的队列
- Direct:定向,把消息交给符合指定routing key 的队列
- Topic:通配符,把消息交给符合routing pattern(路由模式) 的队列
- Consumer:消费者,与以前一样,订阅队列,没有变化
- Queue:消息队列也与以前一样,接收消息、缓存消息。
Exchange(交换机)只负责转发消息,不具备存储消息的能力,因此如果没有任何队列与Exchange绑定,或者没有符合路由规则的队列,那么消息会丢失
基于注解声明队列和交换机
Spring提供了基于注解方式来声明交换机和队列
Direct模式 可以完美替代Fanout模式
消息接收
@RabbitListener(bindings = @QueueBinding(
value = @Queue(name = "direct.queue1"),
exchange = @Exchange(name = "itcast.direct", type = ExchangeTypes.DIRECT),
key = {"red", "blue"}
))
public void listenDirectQueue1(String msg){
System.out.println("消费者接收到direct.queue1的消息:【" + msg + "】");
}@RabbitListener(bindings = @QueueBinding(
value = @Queue(name = "direct.queue2"),
exchange = @Exchange(name = "itcast.direct", type = ExchangeTypes.DIRECT),
key = {"red", "yellow"}
))
public void listenDirectQueue2(String msg){
System.out.println("消费者接收到direct.queue2的消息:【" + msg + "】");
}
消息发送
public void testSendDirectExchange() {
// 交换机名称
String exchangeName = "itcast.direct";
// 消息
String message = "红色警报!日本乱排核废水,导致海洋生物变异,惊现哥斯拉!";
// 发送消息
rabbitTemplate.convertAndSend(exchangeName, "red", message);
}
Topic模式
Topic
类型的Exchange
与Direct
相比,都是可以根据RoutingKey
把消息路由到不同的队列。只不过Topic
类型Exchange
可以让队列在绑定Routing key
的时候使用通配符!
消息发送
public void testSendTopicExchange() {
// 交换机名称
String exchangeName = "itcast.topic";
// 消息
String message = "喜报!孙悟空大战哥斯拉,胜!";
// 发送消息
rabbitTemplate.convertAndSend(exchangeName, "china.news", message);
}
消息接收
@RabbitListener(bindings = @QueueBinding(
value = @Queue(name = "topic.queue1"),
exchange = @Exchange(name = "itcast.topic", type = ExchangeTypes.TOPIC),
key = "china.#"
))
public void listenTopicQueue1(String msg){
System.out.println("消费者接收到topic.queue1的消息:【" + msg + "】");
}@RabbitListener(bindings = @QueueBinding(
value = @Queue(name = "topic.queue2"),
exchange = @Exchange(name = "itcast.topic", type = ExchangeTypes.TOPIC),
key = "#.news"
))
public void listenTopicQueue2(String msg){
System.out.println("消费者接收到topic.queue2的消息:【" + msg + "】");
}
3.6.4.总结
描述下Direct交换机与Topic交换机的差异?
Topic交换机接收的消息RoutingKey必须是多个单词,以
**.**
分割Topic交换机与队列绑定时的bindingKey可以指定通配符
#
:代表0个或多个词*
:代表1个词
消息转换器
Spring会把你发送的消息序列化为字节发送给MQ,接收消息的时候,还会把字节反序列化为Java对象。
只不过,默认情况下Spring采用的序列化方式是JDK序列化。众所周知,JDK序列化存在下列问题:
数据体积过大
有安全漏洞
可读性差
配置JSON转换器
使用JSON方式来做序列化和反序列化。
在publisher和consumer两个服务中都引入依赖:
<dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-xml</artifactId><version>2.9.10</version>
</dependency>
配置消息转换器。
在启动类中添加一个Bean即可:
@Bean
public MessageConverter jsonMessageConverter(){
return new Jackson2JsonMessageConverter();
}
SpringAMQP简单入门, 使用Docker部署RabbitMQ至服务器相关推荐
- 使用Docker部署RabbitMQ集群
使用Docker部署RabbitMQ集群 概述 本文重点介绍的Docker的使用,以及如何部署RabbitMQ集群,最基础的Docker安装,本文不做过多的描述,读者可以自行度娘. Windows10 ...
- docker 部署rabbitmq,k8s部署rabbitmq集群,跟踪和监控rabbitmq
全栈工程师开发手册 (作者:栾鹏) 架构系列文章 rabbit原理和架构可以参考https://blog.csdn.net/luanpeng825485697/article/details/8208 ...
- Docker部署rabbitmq遇到的两个问题
当使用docker部署rabbitmq时遇到两个问题,访问交换机时报错,另一种是访问channel时报错,本文给大家分享解决方案,感兴趣的朋友跟随小编一起看看吧 1.背景 Docker部署rabbit ...
- docker部署rabbitmq出错touch: cannot touch ‘/etc/rabbitmq/rabbitmq.conf‘: Permission denied
docker部署rabbitmq出错touch: cannot touch '/etc/rabbitmq/rabbitmq.conf': Permission denied 首先拉取镜像,这里我使用d ...
- Linux centos7 docker部署gitlab私有服务器
Docker部署gitlab私有服务器,那么,这里必须要有两个软件啦,一个是Docker,一个是gitlab.鉴于很多同学还是不太了解这两个东西,并且观看了不少的其他大神的相关博客,发现对于Docke ...
- 【虚拟化】docker部署Rabbitmq
1.拉取镜像 docker pull rabbitmq:3.7.12 2.启动容器 docker run -di --name=rabbitmq -p 5671:5671 -p 5672:5672 - ...
- [转]docker入门(利用docker部署web应用)
前言:本课程是在慕课网上学习 第一个docker化的java应用 课程时所做的笔记,供本人复习之用 目录 第一章 什么是docker 1.1 docker的发展史 1.2 docker国内应用史 1. ...
- KSO - docker部署Rabbitmq的详细讲解以及各种隐藏坑
docker 下载rabbitmq 同时解决 解决RabbitMQ Management API returned status code 500 问题 解决 管理界面打不开 netcore 程序连接 ...
- Docker部署RabbitMQ
首先拉取镜像: [root@iZ2vc97qcawcm6uqblda2fZ ~]# docker pull rabbitmq:management management: Pulling from l ...
最新文章
- Java中的抽象类和方法
- EOS 核心功能 (2) nodeos
- 第三次学JAVA再学不好就吃翔(part44)--匿名内部类
- java 手写阻塞队列_Java阻塞队列的实现
- (转)Spring+JDBC组合开发
- java电商项目的项目描述_Java电商项目-6.实现门户首页数据展示_Redis数据缓存
- eclipse安装Maven插件M2E
- 用.net中的SqlBulkCopy类批量复制数据 (转载)
- 【李宏毅2020 ML/DL】补充:Ensemble: Bagging, Boosting, Adaboost, Gradient Boosting, Stacking
- 用mapgis数据转成arcgis中shape格式的方法
- 微信小程序 体验版开启调试模式
- SLG手游策略游戏-分析思维
- 物联网概念的理解,物联网核心要素是什么?
- 4G车载信息终端TBOX车联网数据采集智能网联解决方案
- Keras中verbose的作用
- 皮克定理,多边形面积以及线段上整点个数
- 洛谷P3387 【模板】缩点 题解
- 【Java Web 安全】常见安全漏洞及解决方案
- 记录-学习《体验助力传统行业智能化转型》 AlibabaDesign
- 为不同大小的图片添加纯色背景
热门文章
- JS:判断是否是移动端
- ubuntu apt update时W: GPG error http://ppa.launchpad.net lucid Release没有公钥无法验证NO_PUBKEY签名问题解决
- 高等数学——平面曲线的弧长的计算
- 如何解决MathType公式显示方框
- 【教程】GF-1和GF-2PMS数据预处理全流程
- 猫和路由器和交换机有什么区别
- 16亿乐透大奖有独主,也有人输(哭)的响亮
- [深度学习 - 发现有趣项目] masking-gan 人脸生成笑脸表情
- 给vscode设置背景图片~~贼好用
- 数据开放共享的重要性_为什么今天开放数据很重要