RabbitMQ使用及与spring boot整合
1.MQ
消息队列(Message Queue,简称MQ)——应用程序和应用程序之间的通信方法
应用:不同进程Process/线程Thread之间通信
比较流行的中间件:
ActiveMQ
RabbitMQ(非常重量级,更适合于企业级的开发)
Kafka(高吞吐量的分布式发布订阅消息系统)
RocketMQ
在高并发、可靠性、成熟度等方面,RabbitMQ是首选
Kafka的性能(吞吐量、TPS)比RabbitMq要高出来很多,但Kafka主要定位在日志方面,如果业务方面还是建议选择RabbitMq
2.AMQP
Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计
主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全
3.RabbitMQ
RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写
支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX
用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗
(1)安装
需要先安装Erlang ,再安装RabbitMQ
环境:win7
Erlang
下载 :
https://www.erlang-solutions.com/resources/download.html
安装:
双击下载的文件(esl-erlang_22.1~windows_amd64.exe) ,下一步进行安装
安装完后开始菜单多了
RabbitMQ
下载 :
https://www.rabbitmq.com/download.html
安装:
双击下载的文件(rabbitmq-server-3.8.1.exe) ,下一步进行安装
安装完后开始菜单多了
选择开始菜单的RabbitMQ Command Prompt(sbin dir)
进入C:\Program Files (x86)\RabbitMQ Server\rabbitmq_server-3.4.1\sbin输入命令
rabbitmq-plugins enable rabbitmq_management
启动了管理工具
服务启动 net start RabbitMQ
服务停止 net stop RabbitMQ
服务启动后,浏览器打开http://localhost:15672/
使用账号 guest ,密码 guest
能够登录,安装成功
(2)用户管理
Admin选项卡
A.添加用户
用户角色:
超级管理员(administrator)
监控者(monitoring)
策略制定者(policymaker)
普通管理者(management)
其他
B.创建Virtual Hosts
C.设置权限
选中Admin用户,进入权限设置
已添加权限
(3)spring boot整合RabbitMQ
添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
<version>2.2..RELEASE</version>
</dependency>
添加配置
#对于rabbitMQ的支持
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=admin
spring.rabbitmq.virtual-host=testhost
spring.rabbitmq.publisher-confirms=true
spring.rabbitmq.publisher-returns=true
添加RabbitMQ配置类
package com.example.demo.configure; import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; @Configuration
public class RabbitMqConfig { public static final String RABBITMQ_QUEUE_NAME = "Queue1";
public static final String RABBITMQ_ORDER_QUEUE_NAME = "OrderQueue1";
private final static Logger logger = LoggerFactory.getLogger(RabbitMqConfig.class);
@Autowired
private CachingConnectionFactory cachingConnectionFactory; @Bean
public Queue commonQueue() {
return new Queue(RabbitMqConfig.RABBITMQ_QUEUE_NAME);
} @Bean
public Queue orderQueue() {
return new Queue(RabbitMqConfig.RABBITMQ_ORDER_QUEUE_NAME);
} @Bean
public DirectExchange directExchange() {
return new DirectExchange("directExchange");
} @Bean
public TopicExchange topicExchange() {
return new TopicExchange("topicExchange");
} @Bean
public FanoutExchange fanoutExchange() {
return new FanoutExchange("fanoutExchange");
} // 建立Queue与Exchange的绑定关系
@Bean
public Binding bindingExchangeMessage(Queue orderQueue, DirectExchange directExchange) {
return BindingBuilder.bind(orderQueue).to(directExchange).with(
RabbitMqConfig.RABBITMQ_ORDER_QUEUE_NAME);
} @Bean
public RabbitTemplate rabbitTemplate() {
cachingConnectionFactory.setPublisherConfirms(true);
cachingConnectionFactory.setPublisherReturns(true);
RabbitTemplate rabbitTemplate = new RabbitTemplate(cachingConnectionFactory);
rabbitTemplate.setMandatory(true); rabbitTemplate.setConfirmCallback((correlationData, ack, cause) -> {
if (ack)
logger.info("消息发送成功: correlationData:({}),ack:({ack}),cause:({})", correlationData,
ack, cause);
else
logger.info("消息发送失败: correlationData:({}),ack:({ack}),cause:({})", correlationData,
ack, cause);
}); rabbitTemplate.setReturnCallback(
(message, replyCode, replyText, exchange, routingKey) -> logger.info(
"消息丢失:exchange({}),route({}),replyCode({}),replyText({}),message:{}", exchange,
routingKey, replyCode, replyText, message)); return rabbitTemplate;
}
}
生产者
package com.example.demo.mq; import com.example.demo.configure.RabbitMqConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; @Component
public class OrderMaker {
private final static Logger logger = LoggerFactory.getLogger(OrderMaker.class); @Autowired
private RabbitTemplate rabbitTemplate; public void send(String content)
{
this.rabbitTemplate.convertAndSend(RabbitMqConfig.RABBITMQ_ORDER_QUEUE_NAME,content);
}
}
测试入口
package com.example.demo.controller; import com.example.demo.mq.OrderMaker;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController; @RestController
public class Demo { @Autowired
private OrderMaker orderMaker;
@RequestMapping(value = "/testMq",method = RequestMethod.GET,produces = MediaType.ALL_VALUE)
public String testMq(String msg)
{
orderMaker.send(msg);
System.out.println(msg);
return "Successfully.";
}
}
使用postman测试http://127.0.0.1:8080/testMq?msg=hahaha,this is a test
在http://localhost:15672中
OrderQueue1队列有两条消息
查看消息
消费者
package com.example.demo.mq; import com.example.demo.configure.RabbitMqConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component; @Component
@RabbitListener(queues = RabbitMqConfig.RABBITMQ_ORDER_QUEUE_NAME)
public class OrderListener {
private final static Logger logger = LoggerFactory.getLogger(OrderListener.class); @RabbitHandler
public void process(String orderMsg)
{
logger.info("订单消费者收到消息:" + orderMsg);
}
}
重新启动
log输出
2019-11-13 14:36:51.500 [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] INFO com.example.demo.mq.OrderListener - 订单消费者收到消息:hahaha,this is a test
2019-11-13 14:36:51.516 [AMQP Connection 127.0.0.1:5672] INFO com.example.demo.configure.RabbitMqConfig - 消息发送成功: correlationData:(null),ack:({ack}),cause:(true)
这样就实现了简单的队列,生产者将消息发送到队列,消费者从队列中获取消息
P:消息的生产者
C:消息的消费者
红色:队列
RabbitMQ使用及与spring boot整合的更多相关文章
- Spring Boot (十三): Spring Boot 整合 RabbitMQ
1. 前言 RabbitMQ 是一个消息队列,说到消息队列,大家可能多多少少有听过,它主要的功能是用来实现应用服务的异步与解耦,同时也能起到削峰填谷.消息分发的作用. 消息队列在比较主要的一个作用是用 ...
- spring boot 2.x 系列 —— spring boot 整合 RabbitMQ
文章目录 一. 项目结构说明 二.关键依赖 三.公共模块(rabbitmq-common) 四.服务消费者(rabbitmq-consumer) 4.1 消息消费者配置 4.2 使用注解@Rabbit ...
- activeMQ入门+spring boot整合activeMQ
最近想要学习MOM(消息中间件:Message Oriented Middleware),就从比较基础的activeMQ学起,rabbitMQ.zeroMQ.rocketMQ.Kafka等后续再去学习 ...
- 85. Spring Boot集成RabbitMQ【从零开始学Spring Boot】
这一节我们介绍下Spring Boot整合RabbitMQ,对于RabbitMQ这里不过多的介绍,大家可以参考网络上的资源进行安装配置,本节重点是告诉大家如何在Spring Boot中使用Rabbit ...
- Spring Boot 整合多点套路,少走点弯路~
持续原创输出,点击上方蓝字关注我 个人原创博客+1,点击前往,查看更多 目录 前言 Spring Boot 版本 找到自动配置类 注意@Conditionalxxx注解 注意EnableConfigu ...
- Spring Boot 整合 Elasticsearch,实现 function score query 权重分查询
摘要: 原创出处 www.bysocket.com 「泥瓦匠BYSocket 」欢迎转载,保留摘要,谢谢! 『 预见未来最好的方式就是亲手创造未来 – <史蒂夫·乔布斯传> 』 运行环境: ...
- spring boot整合jsp的那些坑(spring boot 学习笔记之三)
Spring Boot 整合 Jsp 步骤: 1.新建一个spring boot项目 2.修改pom文件 <dependency> <groupId>or ...
- spring boot 系列之四:spring boot 整合JPA
上一篇我们讲了spring boot 整合JdbcTemplate来进行数据的持久化, 这篇我们来说下怎么通过spring boot 整合JPA来实现数据的持久化. 一.代码实现 修改pom,引入依赖 ...
- Spring Kafka和Spring Boot整合实现消息发送与消费简单案例
本文主要分享下Spring Boot和Spring Kafka如何配置整合,实现发送和接收来自Spring Kafka的消息. 先前我已经分享了Kafka的基本介绍与集群环境搭建方法.关于Kafka的 ...
随机推荐
- 如何开发一个异常检测系统:异常检测 vs 监督学习
异常检测算法先是将一些正常的样本做为无标签样本来学习模型p(x),即评估参数,然后用学习到的模型在交叉验证集上通过F1值来选择表现最好的ε的值,然后在测试集上进行算法的评估.这儿用到了带有标签的数据, ...
- 74HC595 8位移位寄存器的使用小结
请查看我的博客园文章,比较详细. https://www.cnblogs.com/CodeWorkerLiMing/p/11964258.html
- 我的首次AK记
哈哈哈!本蒟蒻终于在今天中午机房测试中AK全场了(其实没啥技术含量,只有5个水题,对,全都很水)
- 67-Flutter中高德地图插件的使用
1.注册和建立高德API应用 高德网站:https://lbs.amap.com/ 控制台-应用管理-创建应用 在创建 Key 2.获得SHA1 进入Flutter项目中的android文件夹内,打开 ...
- mysql和sqliet连接
Python里Django框架数据库要配置1.setting已经自己配置好2.需要自己连接.找到setting里DATABASES进行连接自己数据库MySQL数据库连接 model里创建数据表就是Dj ...
- swoolefy PHP的异步、并行、高性能网络通信引擎内置了Http/WebSocket服务器端/客户端
近半年来努力付出,项目终于要正式结项了,团队4人经历了很多困难,加班加点,最终完成了!剩下的时间将总结一下在该项目中用到知识和遇到问题.今天就从swoole说起!项目中实现异步大文件传输的功能,在服务 ...
- 【JZOJ5551】【20190625】旅途
题目 \(n\)个点\(m\)条边的无向图,一条路径的代价定义为路径上前\(k\)大边的边权和 对于$k = n \to 1 $,求1-n的最短路 \(n,m \le 3000 \ , \ w_i \ ...
- 第02组 Alpha冲刺(1/4)
队名:十一个憨批 组长博客 作业博客 组长黄智 过去两天完成的任务:进行组员分工 GitHub签入记录 接下来的计划:构思游戏实现 还剩下哪些任务:敲代码 燃尽图 遇到的困难:任务分配的不及时,导致很 ...
- nginx 日志之 access_log格式
Nginx访问日志可以设置自定义的格式,来满足特定的需求. 示例: 示例1 log_format combined_realip '$remote_addr $http_x_forwarded_for ...
- 回滚事件只是让原数据看起来不变,但是id还是会自增吗?
回滚事件只是让原数据看起来不变,但是id还是会自增对吗? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 ...