1_RabbitMQ初入门入门Hello消费者+生产者

文章目录

  • 1_RabbitMQ初入门
    • 1.RabbitMQ的介绍
      • 1.工作原理&发送/接收消息的流程
      • 2. 为什么要使用消息队列?
      • 3.使用了消息队列有什么缺点?
    • 2.安装RabbitMQ
    • 3.入门程序Hello_消费者&生产者_
      • 1.导入依赖
      • 2.生产者
        • 1.设置连接信息
        • 2.获取connection(连接),channel(信道)
        • 3.channel(信道)绑定队列&实现消费方法
        • 4.接收消息
        • 完整代码:
      • 3.消费者
        • 1.设置连接信息
        • 2.获取connection(连接),channel(信道)
        • 3.channel(信道)绑定队列
        • 4.发送消息
        • 完整代码:

1_RabbitMQ初入门

1.RabbitMQ的介绍

1.工作原理&发送/接收消息的流程

image-20200710112436517

  • Broker:消息队列服务进程,此进程包括两个部分:Exchange和Queue。

  • Exchange:消息队列交换机,按一定的规则将消息路由转发到某个队列,对消息进行过虑。

  • Queue:消息队列,存储消息的队列,消息到达队列并转发给指定的消费方。

  • Producer:消息生产者,即生产方客户端,生产方客户端将消息发送到MQ。

  • Consumer:消息消费者,即消费方客户端,接收MQ转发的消息。

    消息发布接收流程:

-----发送消息----- 1、生产者和Broker建立TCP连接。 
2、生产者和Broker建立通道。 
3、生产者通过通道消息发送给Broker,由Exchange将消息进行转发。 
4、Exchange将消息转发到指定的Queue(队列)----接收消息----- 1、消费者和Broker建立TCP连接 
2、消费者和Broker建立通道 
3、消费者监听指定的Queue(队列) 
4、当有消息到达Queue时Broker默认将消息推送给消费者。 
5、消费者接收到消息。 

2. 为什么要使用消息队列?

解耦,异步,削峰

image-20200710112201880

3.使用了消息队列有什么缺点?

分析:一个使用了MQ的项目,如果连这个问题都没有考虑过,就把MQ引进去了,那就给自己的项目带来了风险。我们引入一个技术,要对这个技术的弊端有充分的认识,才能做好防御。

系统的可用性降低:如果消息队列挂了,那么系统也会受到影响

系统的复杂性增加:要多考虑很多方面的问题,比如一致性问题、如何保证消息不被重复消费,如何保证消息可靠传输。因此,需要考虑的东更多,系统的复杂性增大。

2.安装RabbitMQ

详情请参考此链接

3.入门程序Hello_消费者&生产者_

1.导入依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId>
</dependency><!-- 这个是日志包的依赖 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId>
</dependency>

2.生产者

1.设置连接信息

通过ConnectionFactory获取连接信息

//通过连接工厂创建新的连接和mq建立连接
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("127.0.0.1");
connectionFactory.setPort(5672);//端口
connectionFactory.setUsername("guest");
connectionFactory.setPassword("guest");
//设置虚拟机,一个mq服务可以设置多个虚拟机,每个虚拟机就相当于一个独立的mq
connectionFactory.setVirtualHost("/");

2.获取connection(连接),channel(信道)

Connection connection = null;
Channel channel = null;
//建立新连接
connection = connectionFactory.newConnection();
//创建会话通道,生产者和mq服务所有通信都在channel通道中完成
channel = connection.createChannel();

3.channel(信道)绑定队列&实现消费方法

//队列
private static final String QUEUE = "helloworld";//监听队列
//声明队列,如果队列在mq 中没有则要创建
//参数:String queue, boolean durable, boolean exclusive, boolean autoDelete, M
/*** 参数明细* 1、queue 队列名称* 2、durable 是否持久化,如果持久化,mq重启后队列还在* 3、exclusive 是否独占连接,队列只允许在该连接中访问,如果connection连接关闭队列则自动删除,如果将此参数设置true可用于临时* 4、autoDelete 自动删除,队列不再使用时是否自动删除此队列,如果将此参数和exclusive参数设置为true就可以实现临时队列(队列不* 5、arguments 参数,可以设置一个队列的扩展参数,比如:可设置存活时间*/
channel.queueDeclare(QUEUE,true,false,false,null);//实现消费方法
DefaultConsumer defaultConsumer = new DefaultConsumer(channel){/*** 当接收到消息后此方法将被调用* @param consumerTag  消费者标签,用来标识消费者的,在监听队列时设置channel.basicConsume* @param envelope 信封,通过envelope* @param properties 消息属性* @param body 消息内容* @throws IOException*/@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.B//交换机String exchange = envelope.getExchange();//消息id,mq在channel中用来标识消息的id,可用于确认消息已接收long deliveryTag = envelope.getDeliveryTag();//消息内容String message= new String(body,"utf-8");System.out.println("receive message:"+message);}
};

4.接收消息

 //监听队列//参数:String queue, boolean autoAck, Consumer callback/*** 参数明细:* 1、queue 队列名称* 2、autoAck 自动回复,当消费者接收到消息后要告诉mq消息已接收,如果将此参数设置为tru表示会自动回复mq,如果设置为false要通过编程实现回复* 3、callback,消费方法,当消费者接收到消息要执行的方法*/channel.basicConsume(QUEUE,true,defaultConsumer);

结果截图:

image-20200710120033120

完整代码:

package com.xuecheng.test.rabbitmq;import com.rabbitmq.client.*;import java.io.IOException;
import java.util.concurrent.TimeoutException;public class Consumer01 {//队列private static final String QUEUE = "helloworld";public static void main(String[] args) throws IOException, TimeoutException {//通过连接工厂创建新的连接和mq建立连接ConnectionFactory connectionFactory = new ConnectionFactory();connectionFactory.setHost("127.0.0.1");connectionFactory.setPort(5672);//端口connectionFactory.setUsername("guest");connectionFactory.setPassword("guest");//设置虚拟机,一个mq服务可以设置多个虚拟机,每个虚拟机就相当于一个独立的mqconnectionFactory.setVirtualHost("/");//建立新连接Connection connection = connectionFactory.newConnection();//创建会话通道,生产者和mq服务所有通信都在channel通道中完成Channel channel = connection.createChannel();//监听队列//声明队列,如果队列在mq 中没有则要创建//参数:String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments/*** 参数明细* 1、queue 队列名称* 2、durable 是否持久化,如果持久化,mq重启后队列还在* 3、exclusive 是否独占连接,队列只允许在该连接中访问,如果connection连接关闭队列则自动删除,如果将此参数设置true可用于临时队列的创建* 4、autoDelete 自动删除,队列不再使用时是否自动删除此队列,如果将此参数和exclusive参数设置为true就可以实现临时队列(队列不用了就自动删除)* 5、arguments 参数,可以设置一个队列的扩展参数,比如:可设置存活时间*/channel.queueDeclare(QUEUE,true,false,false,null);//实现消费方法DefaultConsumer defaultConsumer = new DefaultConsumer(channel){/*** 当接收到消息后此方法将被调用* @param consumerTag  消费者标签,用来标识消费者的,在监听队列时设置channel.basicConsume* @param envelope 信封,通过envelope* @param properties 消息属性* @param body 消息内容* @throws IOException*/@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {//交换机String exchange = envelope.getExchange();//消息id,mq在channel中用来标识消息的id,可用于确认消息已接收long deliveryTag = envelope.getDeliveryTag();//消息内容String message= new String(body,"utf-8");System.out.println("receive message:"+message);}};//监听队列//参数:String queue, boolean autoAck, Consumer callback/*** 参数明细:* 1、queue 队列名称* 2、autoAck 自动回复,当消费者接收到消息后要告诉mq消息已接收,如果将此参数设置为tru表示会自动回复mq,如果设置为false要通过编程实现回复* 3、callback,消费方法,当消费者接收到消息要执行的方法*/channel.basicConsume(QUEUE,true,defaultConsumer);}
}

3.消费者

1.设置连接信息

通过ConnectionFactory获取连接信息

//通过连接工厂创建新的连接和mq建立连接
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("127.0.0.1");
connectionFactory.setPort(5672);//端口
connectionFactory.setUsername("guest");
connectionFactory.setPassword("guest");
//设置虚拟机,一个mq服务可以设置多个虚拟机,每个虚拟机就相当于一个独立的mq
connectionFactory.setVirtualHost("/");

2.获取connection(连接),channel(信道)

Connection connection = null;
Channel channel = null;
//建立新连接
connection = connectionFactory.newConnection();
//创建会话通道,生产者和mq服务所有通信都在channel通道中完成
channel = connection.createChannel();

3.channel(信道)绑定队列

//队列
private static final String QUEUE = "helloworld";//声明队列,如果队列在mq 中没有则要创建
//参数:String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments
/*** 参数明细* 1、queue 队列名称* 2、durable 是否持久化,如果持久化,mq重启后队列还在* 3、exclusive 是否独占连接,队列只允许在该连接中访问,如果connection连接关闭队列则自动删除,如果将此参数设置true可用于临时队列的创建* 4、autoDelete 自动删除,队列不再使用时是否自动删除此队列,如果将此参数和exclusive参数设置为true就可以实现临时队列(队列不用了就自动删除)* 5、arguments 参数,可以设置一个队列的扩展参数,比如:可设置存活时间*/
channel.queueDeclare(QUEUE,true,false,false,null);

4.发送消息

//参数:String exchange, String routingKey, BasicProperties props, byte[] bod
/*** 参数明细:* 1、exchange,交换机,如果不指定将使用mq的默认交换机(设置为"")* 2、routingKey,路由key,交换机根据路由key来将消息转发到指定的队列,如果使用默认交换机,routingKey设置为队列的名称* 3、props,消息的属性* 4、body,消息内容*/
//消息内容
String message = "hello world 黑马程序员";
channel.basicPublish("",QUEUE,null,message.getBytes());
System.out.println("send to mq "+message);

结果截图:

image-20200710115313167

完整代码:

package com.xuecheng.test.rabbitmq;import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;import java.io.IOException;
import java.util.concurrent.TimeoutException;public class Producer01 {//队列private static final String QUEUE = "helloworld";public static void main(String[] args) {//通过连接工厂创建新的连接和mq建立连接ConnectionFactory connectionFactory = new ConnectionFactory();connectionFactory.setHost("127.0.0.1");connectionFactory.setPort(5672);//端口connectionFactory.setUsername("guest");connectionFactory.setPassword("guest");//设置虚拟机,一个mq服务可以设置多个虚拟机,每个虚拟机就相当于一个独立的mqconnectionFactory.setVirtualHost("/");Connection connection = null;Channel channel = null;try {//建立新连接connection = connectionFactory.newConnection();//创建会话通道,生产者和mq服务所有通信都在channel通道中完成channel = connection.createChannel();//声明队列,如果队列在mq 中没有则要创建//参数:String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments/*** 参数明细* 1、queue 队列名称* 2、durable 是否持久化,如果持久化,mq重启后队列还在* 3、exclusive 是否独占连接,队列只允许在该连接中访问,如果connection连接关闭队列则自动删除,如果将此参数设置true可用于临时队列的创建* 4、autoDelete 自动删除,队列不再使用时是否自动删除此队列,如果将此参数和exclusive参数设置为true就可以实现临时队列(队列不用了就自动删除)* 5、arguments 参数,可以设置一个队列的扩展参数,比如:可设置存活时间*/channel.queueDeclare(QUEUE,true,false,false,null);//发送消息//参数:String exchange, String routingKey, BasicProperties props, byte[] body/*** 参数明细:* 1、exchange,交换机,如果不指定将使用mq的默认交换机(设置为"")* 2、routingKey,路由key,交换机根据路由key来将消息转发到指定的队列,如果使用默认交换机,routingKey设置为队列的名称* 3、props,消息的属性* 4、body,消息内容*///消息内容String message = "hello world 黑马程序员";channel.basicPublish("",QUEUE,null,message.getBytes());System.out.println("send to mq "+message);} catch (Exception e) {e.printStackTrace();} finally {//关闭连接//先关闭通道try {channel.close();} catch (IOException e) {e.printStackTrace();} catch (TimeoutException e) {e.printStackTrace();}try {connection.close();} catch (IOException e) {e.printStackTrace();}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/482666.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《Nature》:衰老后的核糖体发生了哪些致病变化

来源&#xff1a;生物通研究发现&#xff0c;产生蛋白质的细胞装配线会随着年龄的增长而停滞&#xff0c;从而引发雪球效应&#xff0c;增加错误折叠蛋白质的产量。在人类中&#xff0c;成堆的错误折叠蛋白质会导致与年龄相关的阿尔茨海默病和帕金森病。衰老会损害核糖体有效合…

[转载]eXeScope 6.50本地溢出分析

作 者: humourkyo时 间: 2009-03-30,21:03链 接: http://bbs.pediy.com/showthread.php?t84975无聊逛了下http://www.milw0rm.com 看最近有什么ODAY没&#xff0c;顺便挑一个分析下玩玩。于是就看到了这个http://www.milw0rm.com/exploits/8270是eXeScope 6.50 Local Buffer O…

饶毅:中国脑计划是我见过的最差科学经费管理,中国猴计划应该缓行

左&#xff1a;饶毅 右&#xff1a;蒲慕明来源&#xff1a;饶议科学 作者&#xff1a;饶毅原标题&#xff1a;中国猴计划应该缓行在我国上上下下左左右右普遍对支持科学研究有广泛共识&#xff0c;在我国具备一定支持科学研究的经济条件的情况下&#xff0c;科技部正在推动最大…

2_RabbitMQ工作模式_Work queues_Publish/Subscribe_Routing_Topics_HeaderRpc

文章目录2_RabbitMQ工作模式1.Work queues2.Publish/Subscribe1.工作模式2.代码1.生产者1.指定消息队列相关消息2.建立连接&绑定队列3.发送消息完整代码&#xff1a;2.消费者1.指定消息队列相关消息2.建立连接&绑定队列3.实现消费方法&监听消息完整代码3.小结3.Rou…

1000亿美元!英特尔要在美国建世界最大芯片厂,美520 亿美元芯片法案接近敲定...

来源&#xff1a;新智元编辑&#xff1a;桃子 拉燕 时光1000亿美元芯片计划&#xff0c;要重振英特尔往日雄风&#xff01;路透称&#xff0c;英特尔将投资200亿美元建设2家芯片制造工厂&#xff0c;并计划最终投资多达1000亿美元。新工厂的建设将于今年晚些时候开始&#xff0…

Vue 组件间通信六种方式

前言 组件是 vue.js最强大的功能之一&#xff0c;而组件实例的作用域是相互独立的&#xff0c;这就意味着不同组件之间的数据无法相互引用。一般来说&#xff0c;组件可以有以下几种关系&#xff1a; 如上图所示&#xff0c;A 和 B、B 和 C、B 和 D 都是父子关系&#xff0c;C …

vue-day01-vue模板语法

文章目录Vue 是什么&#xff1f;使用Vue将helloworld 渲染到页面上指令v-cloakv-textv-htmlv-pre**v-once**双向数据绑定v-modelmvvmv-onv-on事件函数中传入参数事件修饰符按键修饰符自定义按键修饰符别名小案例-简单计算器v-bind绑定对象绑定class绑定对象和绑定数组 的区别绑…

IEEE Spectrum调查:AI 的 6 种最坏情况

来源&#xff1a;AI科技评论编译&#xff1a;辛西娅审核&#xff1a;维克多对于人类社会&#xff0c;人工智能&#xff08;AI&#xff09;带来的最大威胁是什么&#xff1f;好莱坞科幻电影的“想象”提供了答案&#xff1a;它逐渐进化&#xff0c;获得人类思考能力&#xff0c;…

212页PPT详解MEMS微传感器的工作原理(深入全面!)

来源&#xff1a;传感器专家网本文是关于MEMS微传感器的工作原理最全面的内容&#xff0c;分为两部分&#xff0c;共计212页PPT内容。主要讲解了MEMS微传感器的概念、分类&#xff0c;基本敏感原理介绍&#xff0c;MEMS微传感器实例、MEMS微执行器分类、基本致动方式介绍、微执…

Lucene-01 全文检索基本介绍

文章目录课程计划什么是全文检索数据分类结构化数据搜索非结构化数据查询方法如何实现全文检索全文检索的应用场景Lucene实现全文检索的流程索引和搜索流程图创建索引获得原始文档创建文档对象分析文档创建索引查询索引用户查询接口创建查询执行查询渲染结果全文检索技术Lucene…

为何生命进化的方向是衰老,而不是永生?

来源&#xff1a;科学的乐园永生似乎是全世界各种文化里都在追求的一种状态&#xff0c;为此古代的人们发展出了宗教&#xff0c;用来寄托死亡带来的遗憾。而人类也在想尽一切办法抑制衰老&#xff0c;各种护肤品、保养品相继问世。当然人类在这条追求永生的道路上也吃了很多苦…

vue-day02-vue常用特性

文章目录Vue常用特性表单基本操作表单修饰符自定义指令Vue.directive 注册全局指令Vue.directive 注册全局指令 带参数自定义指令局部指令计算属性 computed侦听器 watch过滤器过滤器中传递参数生命周期常用的 钩子函数数组变异方法替换数组动态数组响应式数据图书列表案例1、 …

2022年,哪些科技趋势将持续改变世界?这里有一份来自百度研究院的预测

来源&#xff1a;数学中国编辑部弹指之间&#xff0c;2021 年已经远去。这一年&#xff0c;新冠疫情全球经济和社会生活带来诸多挑战&#xff0c;同时&#xff0c;科学技术的力量得以持续显现。技术进步与产业发展的速度进一步加快&#xff0c;数字技术、智能技术为人们的生活带…

CSS每日学习笔记(1)

7.30.2019 1.CSS 文本属性 属性 描述 color 设置文本颜色 direction 设置文本方向。 line-height 设置行高。 letter-spacing 设置字符间距。 text-align 对齐元素中的文本。 text-decoration 向文本添加修饰。 text-indent 缩进元素中文本的首行。 text-shado…

vue-day03-vue组件化开发

文章目录组件组件注册全局注册组件基础用组件注意事项局部注册Vue 调试工具Vue组件之间传值父组件向子组件传值子组件向父组件传值兄弟之间的传递组件插槽匿名插槽具名插槽作用域插槽购物车案例1. 实现组件化布局2、实现 标题和结算功能组件3. 实现列表组件删除功能4. 实现组件…

智源发布《人工智能的认知神经基础白皮书》,一览“AI×脑科学”前沿

图. 智源研究院《人工智能的认知神经基础白皮书》&#xff08;2021年&#xff09;来源&#xff1a;智源研究院智源研究院发布 2021 年度《人工智能的认知神经基础白皮书》&#xff0c;兼具专业性与科普性&#xff0c;是人工智能学者探寻“AI脑科学”交叉学科研发创新的导览之作…

VR视觉健康标准在穗发布 专家:VR使用不要超过45分钟

来源&#xff1a;VR每日必看近期&#xff0c;“元宇宙”新兴概念备受关注&#xff0c;虚拟现实&#xff08;下称“VR”&#xff09;技术也被国内外媒体评为“第四次工业革命的钥匙之一”。但是&#xff0c;有不少人对VR眼镜等设备感到担忧&#xff1a;使用它会损害视力吗&#…

vue-day04-vue前端交互

文章目录接口调用方式异步promise基于Promise发送Ajax请求Promise 基本API实例方法.then().catch().finally()静态方法.all().race()fetch概览fetch请求参数&#xff08;图片记录&#xff09;fetch API 中的 HTTP 请求fetchAPI 中 响应格式axiosaxios基础用法axios的响应结果ax…

用数学范畴定义生命的尝试

来源&#xff1a;CreateAMind介绍一篇关于生命构建的论文Polynomial Life: the Structure of Adaptive Systems Toby St. Clere Smithe Topos Institute tobytopos.institute关键词&#xff1a;精确地形式化概念&#xff1b;是什么赋予了物理系统生命&#xff1b;贝叶斯、 信念…

git-从入门到熟悉

文章目录Git历史Git与svn对比SvnGitgit工作流程Git的安装软件下载软件安装安装git for windows安装TortoiseGit安装中文语言包使用git管理文件版本创建版本库使用GitBash使用TortoiseGit添加文件添加文件过程工作区和暂存区修改文件提交修改查看修改历史差异比较还原修改删除文…