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的 ...
随机推荐
- wordpress去掉自定义菜单的外层div
wordpress调用自定义菜单时自动会在外层加一个<div class="menu-nav-container">,如下图所示,nav是后台定义的菜单名称,如果想把这 ...
- SpringMVC+Mybatis学习
简单Web项目搭建: 一.流程 1. 导包 n个springMVC: 2个mybatis<其中一个是mybatis-spring>: 3个jackson包: 2. xml配置 web.xm ...
- 到底该不该用RTOS——rtos的优点
我现在要不要学习RTOS? 学习RTOS有什么好处? 我的项目要不要跑RTOS? ······等等一些关于RTOS的问题,其实归根结底还是你对RTOS了解的不够,项目开发的经验还不足等. 针对这部分朋 ...
- OpenCV 学习笔记(0)两幅图像标定配准
参考教程 依赖opencv扩展库,使用sifi匹配 保存配准信息 "./config/calibratedPara.yaml" #include <iostream> ...
- 插入排序;至少要比较N(N-1)/2次;N表示元素个数
<script type="text/javascript"> //冒泡排序:至少要比较N(N-1)/2次:N表示元素个数 function get(){ var nu ...
- 20181107 模拟赛T1:快乐传递政治正确版
问题描述 David 有很多好朋友.有些期末季刚结束,有些人很快乐,但有些不太快乐,David 想把快乐传递给每个人,作为心理学大师,他准备了如下计划:David 的朋友中有 n 个男生和 m 个女生 ...
- JS中判断空对象
js 判断空对象 首先要区分一个概念,空对象和空引用: 空对象:{}是指不含任何属性的对象,当然对象属性包括字面值和函数. 空引用:obj=null 是指变量值指向null变量,当然在js默认不赋值的 ...
- navigator对象(了解即可)
navigator是window的子对象 navigator.appName // Web浏览器全称navigator.appVersion // Web浏览器厂商和版本的详细字符串navigator ...
- js字符串连接
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> </head> ...
- nginx之allow、deny
allow和deny这两个指令的意思是指,允许ip和限制ip 在此之前不得不提一下,这两个指令是存在于ngx_http_access_module模块之中的 allow语法:allow address ...