RabbitMQ 核心部分之简单模式和工作模式

文章目录

  • 一、Hello World(简单)模式
    • 1.导入依赖
    • 2.消息生产者
    • 3.消息消费者
  • 二、Work Queues(工作)模式
    • 1.抽取工具类
    • 2.启动两个工作线程
    • 3.启动一个发送线程
    • 4.结果
  • 总结


一、Hello World(简单)模式

在下图中,“ P”是我们的生产者,“ C”是我们的消费者。中间的框是一个队列-RabbitMQ 代
表使用者保留的消息缓冲区
在这里插入图片描述
博主这里使用JAVA实现。

1.导入依赖

<!--指定 jdk 编译版本-->
<build>
 	<plugins>
 		<plugin>
 			<groupId>org.apache.maven.plugins</groupId>
 			<artifactId>maven-compiler-plugin</artifactId>
 			<configuration>
 				<source>8</source>
 				<target>8</target>
 			</configuration>
 		</plugin>
 	</plugins>
</build>
<dependencies>
 	<!--rabbitmq 依赖客户端-->
 	<dependency>
 		<groupId>com.rabbitmq</groupId>
 		<artifactId>amqp-client</artifactId>
		<version>5.8.0</version>
 	</dependency>
 	<!--操作文件流的一个依赖-->
 	<dependency>
 		<groupId>commons-io</groupId>
 		<artifactId>commons-io</artifactId>
 		<version>2.6</version>
 	</dependency>
</dependencies>

2.消息生产者

public class Producer {
 	private final static String QUEUE_NAME = "hello";
	public static void main(String[] args) throws Exception {
 		//创建一个连接工厂
 		ConnectionFactory factory = new ConnectionFactory();
 		factory.setHost("192.168.10.130");
 		factory.setUsername("guest");
 		factory.setPassword("guest");
 		//channel 实现了自动 close 接口 自动关闭 不需要显示关闭
 		try(Connection connection = factory.newConnection();Channel channel = 
connection.createChannel()) {
 			/**
 			* 生成一个队列
 			* 1.队列名称
 			* 2.队列里面的消息是否持久化 默认消息存储在内存中
 			* 3.该队列是否只供一个消费者进行消费 是否进行共享 true 可以多个消费者消费
 			* 4.是否自动删除 最后一个消费者端开连接以后 该队列是否自动删除 true 自动删除
 			* 5.其他参数
 			*/
 			channel.queueDeclare(QUEUE_NAME,false,false,false,null);
 			String message="hello world";
 			/**
 			* 发送一个消息
 			* 1.发送到那个交换机
 			* 2.路由的 key 是哪个
 			* 3.其他的参数信息
 			* 4.发送消息的消息体
 			*/
 			channel.basicPublish("",QUEUE_NAME,null,message.getBytes());
 			System.out.println("消息发送完毕");
 		}
 	}
}

3.消息消费者

public class Consumer {
 	private final static String QUEUE_NAME = "hello";
	public static void main(String[] args) throws Exception {
 		ConnectionFactory factory = new ConnectionFactory();
 		factory.setHost("192.168.10.130");
 		factory.setUsername("guest");
 		factory.setPassword("guest");
 		Connection connection = factory.newConnection();
 		Channel channel = connection.createChannel();
 		System.out.println("等待接收消息....");
 		//推送的消息如何进行消费的接口回调
 		DeliverCallback deliverCallback=(consumerTag,delivery)->{
 			String message= new String(delivery.getBody());
 			System.out.println(message);
 		};
 		//取消消费的一个回调接口 如在消费的时候队列被删除掉了
 		CancelCallback cancelCallback=(consumerTag)->{
 		System.out.println("消息消费被中断");
 		};
 		/**
 		* 消费者消费消息
 		* 1.消费哪个队列
 		* 2.消费成功之后是否要自动应答 true 代表自动应答 false 手动应答
 		* 3.消费者未成功消费的回调
 		*/
 		channel.basicConsume(QUEUE_NAME,true,deliverCallback,cancelCallback);
 	}
 }

二、Work Queues(工作)模式

工作队列(又称任务队列)的主要思想是避免立即执行资源密集型任务,而不得不等待它完成。
相反我们安排任务在之后执行。我们把任务封装为消息并将其发送到队列。在后台运行的工作进
程将弹出任务并最终执行作业。当有多个工作线程时,这些工作线程将一起处理这些任务。

1.抽取工具类

public class RabbitMqUtils {
 	//得到一个连接的 channel
 	public static Channel getChannel() throws Exception{
 		//创建一个连接工厂
 		ConnectionFactory factory = new ConnectionFactory();
 		factory.setHost("192.168.10.130");
 		factory.setUsername("guest");
 		factory.setPassword("guest");
 		Connection connection = factory.newConnection();
 		Channel channel = connection.createChannel();
 		return channel;
 	}
}

2.启动两个工作线程

public class Worker01 {
 	private static final String QUEUE_NAME="hello";
 	public static void main(String[] args) throws Exception {
 		Channel channel = RabbitMqUtils.getChannel();
 		DeliverCallback deliverCallback=(consumerTag,delivery)->{
 			String receivedMessage = new String(delivery.getBody());
 			System.out.println("接收到消息:"+receivedMessage);
 		};
 		CancelCallback cancelCallback=(consumerTag)->{
 			System.out.println(consumerTag+"消费者取消消费接口回调逻辑");
		};
 		System.out.println("C2 消费者启动等待消费......");
 		channel.basicConsume(QUEUE_NAME,true,deliverCallback,cancelCallback);
 	}
}

3.启动一个发送线程

public class Task01 {
 	private static final String QUEUE_NAME="hello";
 	public static void main(String[] args) throws Exception {
 		try(Channel channel=RabbitMqUtils.getChannel();) {
 			channel.queueDeclare(QUEUE_NAME,false,false,false,null);
 			//从控制台当中接受信息
 			Scanner scanner = new Scanner(System.in);
 			while (scanner.hasNext()){
 				String message = scanner.next();
 				channel.basicPublish("",QUEUE_NAME,null,message.getBytes());
 				System.out.println("发送消息完成:"+message);
 			}
 		}
 	}
}

4.结果

通过程序执行发现生产者总共发送 4 个消息,消费者 1 和消费者 2 分别分得两个消息,并且
是按照有序的一个接收一次消息
在这里插入图片描述


总结

以上就是RabbitMQ 核心部分之简单模式和工作模式的相关知识,希望对你有所帮助。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

内衣洗衣机和手洗哪个干净?好用的内衣洗衣机推荐

在日常生活中&#xff0c;我们的衣服不可避免地会沾染上各种细菌、毛发和污渍&#xff0c;将它们与贴身衣物混合清洗&#xff0c;很容易发生交叉感染&#xff0c;而被感染后&#xff0c;贴身衣物也有可能导致我们人体引起皮肤病。这也是为什么大部分人都喜欢用手洗的原因&#…

SA实战 ·《SpringCloud Alibaba实战》第13章-服务网关:项目整合SpringCloud Gateway网关

大家好,我是冰河~~ 一不小心[SpringCloud Alibaba实战》专栏都更新到第13章了,再不上车就跟不上了,小伙伴们快跟上啊! 在《SpringCloud Alibaba实战》专栏前面的文章中,我们实现了用户微服务、商品微服务和订单微服务之间的远程调用,并且实现了服务调用的负载均衡。也基于…

MBTI职业性格测试,用于职业选择是否靠谱

关于性格测试的看法 所有人都会说我了解自己的性格&#xff01;但真的了解吗&#xff1f;性格有外在表现&#xff0c;也有内因的驱动&#xff0c;我们通常感受到的是性格的外在表现.... 性格测试&#xff0c;是针对有想法要改变自己和提高自己的人&#xff0c;如果你一个懒字…

cubemx为啥在SPI配置时将MISO设置为AFPP,而不是输入模式

一般来说在配置SPI的时候&#xff0c;SCK、MOSI、NSS&#xff1a;通常配置为推挽输出模式&#xff0c;在单主机模式下&#xff0c;可以将NSS引脚配置为GPIO输出&#xff0c;MISO通常需要配置为浮空输入或上拉输入模式&#xff0c;但是cubemx却其配置成推挽输出模式&#xff0c;…

多模态及图像安全的探索与思考

前言 第六届中国模式识别与计算机视觉大会&#xff08;The 6th Chinese Conference on Pattern Recognition and Computer Vision, PRCV 2023&#xff09;已于近期在厦门成功举办。通过参加本次会议&#xff0c;使我有机会接触到许多来自国内外的模式识别和计算机视觉领域的研究…

janus 安装部署

本文使用docker进行安装&#xff0c;还没有安装docker和docker-compose的&#xff0c;请自行安装&#xff0c;这里就不介绍了 环境 janus-gateway镜像版本:anyan/janus-gateway:0.10.7 linux版本: Ubuntu 18.04.6 LTS coturn/coturn 镜像版本: coturn/coturn:latest 镜像ID 8…

觉非科技发布【轻地图高速NOA智驾方案】|地平线,觉非科技,MobileDrive超捷生态协作实现技术落地

11月10日&#xff0c;2023世界新汽车技术合作生态展期间&#xff0c;觉非科技正式发布了基于地平线征程系列以及MobileDrive超捷规控系统的【轻地图高速NOA智驾解决方案】。该方案首次实现了从芯片能力输出、到数据闭环建设、再到规控部署的产业生态链协作与打通&#xff0c;为…

员工电脑监控的方法有哪些

有人在后台问&#xff0c;员工电脑监控的方法有哪些&#xff1f; 其实主要包括以下几方面&#xff1a;1&#xff09;安装监控软件 2&#xff09;使用操作系统自带的工具 3&#xff09;部署网络监控设备 4&#xff09;定期检查电脑 5&#xff09;制定严格的规章制度 因为内容比…

23款奔驰C260L升级原厂360全景影像 超广角的视野

本次星骏汇小许介绍的是23款奔驰C260L升级原厂360全景影像&#xff0c;上帝视角看清车辆周围环境&#xff0c;更轻松驾驶 升级360全景影像系统共有前后左右4个摄像头&#xff0c;分别在车头&#xff0c;车尾&#xff0c;以及两边反光镜下各一个&#xff0c;分别用来采集车头&am…

在ant构建脚本中调用maven的命令

有时候想用maven管理依赖&#xff0c;用ant构建。 在ant的build.xml文件中可以使用exec这个task来调用系统命令&#xff0c;也就可以调用maven的命令。 例如&#xff0c;执行maven的命令mvn dependency:copy-dependencies&#xff0c;可以将项目的依赖提取出来&#xff0c;放…

【ARL灯塔搭建详细教程】

文章目录 前言一、前期准备二、安装docker及docker-compose三、安装ARL灯塔四、登录ARL灯塔 前言 ARL&#xff08;Asset Reconnaissance Lighthouse&#xff09;资产侦查灯塔旨在快速发现并整理企业外网资产并为资产构建基础数据库&#xff0c;无需登录凭证或特殊访问即可主动…

低代码平台加持后紧急交付项目如何突破极限

导读&#xff1a; 传统开发低代码开发&#xff0c;两种开发模式的深度融合&#xff0c;基于已有的业务沉淀&#xff0c;快速实现项目中大量的定制需求&#xff0c;高速、高能使得传统项目最为宝贵的工期变得充裕。 项目管理的十大知识域中&#xff0c;其实并没有专门的时间&…

人工智能基础_机器学习027_L2正则化_岭回归_非稀疏性_原理解读_公式推导---人工智能工作笔记0067

然后我们再来看一下岭回归,也就是第二范数对吧, 他的公式,平方以后,加和然后开平方.L2的公式是 可以看到L2公式,也是有个阿尔法,惩罚项对吧. 可以看到因为L2带有平方,所以他的图形是个圆形 我们可以把L2范数,进行画出来看看 这里我们先看L2的公式,这里我们让 这个公式写成1 …

提升自动化测试:Apifox 产品更新全解析!

Apifox 新版本上线啦&#xff01; 看看本次版本更新主要涵盖的重点内容&#xff0c;有没有你所关注的功能特性&#xff1a; 自动化测试 新增 ForEach 循环组件数据库连接支持 MongoDB前/后置操作模块能力升级 支持使用 pm.executeAsync 异步执行外部程序支持自定义外部程序的…

linux 系统下文本编辑常用的命令

一、是什么 Vim是从 vi 发展出来的一个文本编辑器&#xff0c;代码补全、编译及错误跳转等方便编程的功能特别丰富&#xff0c;在程序员中被广泛使用。 简单的来说&#xff0c; vi 是老式的字处理器&#xff0c;不过功能已经很齐全了&#xff0c;但是还是有可以进步的地方 而…

小黑子—springMVC:第二章 拦截器、全注解开发和异常处理机制

springMVC入门2.0 4、小黑子的springMVC拦截器4.1 Interceptor简介4.2 拦截器快速入门4.3 拦截器执行顺序4.4 拦截器执行原理 5、小黑子的springMVC全注解开发5.1 spring-mvc.xml中组件转化为注解形式5.1.1 消除spring-mvc.xml一二三 5.1.2 消除web.xml 6、小黑子的springMVC组…

内衣洗衣机怎么选?小型洗衣机质量排名

现在大部分的家庭都拥有高质量、大品牌、大容量的洗烘套装来满足一家人的日常洗烘需要&#xff0c;像内衣这种贴身的衣物&#xff0c;需要手洗或者用专用的内衣洗衣机&#xff0c;这样才可以最大程度地减少细菌的交叉感染&#xff0c;提高我们贴身衣物的卫生&#xff0c;那么怎…

Android WebView专题

WebView 专题 第一个WebView程序&#xff1a;加载远程网址 Layout添加WebView组件&#xff1b; <WebViewandroid:id"id/webView_first"android:layout_width"match_parent"android:layout_height"match_parent"/>初始化组件&#xff0c;加…
最新文章