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

news2024/12/24 18:20:54

文章目录

  • 一、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.coloradmin.cn/o/1207200.html

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

相关文章

东北水利水电杂志东北水利水电杂志社东北水利水电编辑部2023年第11期目录

规划设计 导流泄洪洞射流-旋流梯级内消能工竖井出口体型优化 李金宝; 1-371 粉细砂地层防洪结构新形式研究 李泽鑫; 4-6《东北水利水电》投稿&#xff1a;cnqikantg126.com 引绰济辽工程鱼道进鱼口位置选择 银佳男;于月鹏;张鹏; 7-82471 大藤峡水利枢纽工程长期…

CRM销售管理软件哪个好,如何选?(二)

书接上回&#xff0c;我们从软件功能和厂商实力为大家介绍了CRM销售管理软件哪个好&#xff1f;该如何选型的难题&#xff0c;除了以上两点还有那些不容忽视的要素呢&#xff1f; 灵活性 CRM销售管理软件是企业信息化建设的中心&#xff0c;需要和其它企业管理应用进行集成实…

Python使用Mechanize库完成自动化爬虫程序

Mechanize是一个Python第三方库&#xff0c;它可以模拟浏览器的行为&#xff0c;实现自动化的网页访问、表单填写、提交等操作。下面是一个使用Mechanize库编写的爬虫的例子&#xff0c;它可以爬取百度搜索结果页面的标题和链接&#xff1a; import mechanize from bs4 import …

将铜互连扩展到2nm的研究

晶体管尺寸在3nm时达到临界点&#xff0c;纳米片FET可能会取代finFET来满足性能、功耗、面积和成本目标。同样&#xff0c;正在评估2nm铜互连的重大架构变化&#xff0c;此举将重新配置向晶体管传输电力的方式。 芯片制造商也可能会在2nm节点开始用钌或钼在一定程度上取代铜。…

一寸证件照排版工具,在线将证件照排版在相纸上

证件照是我们经常使用到的一种办事资料&#xff0c;考试报名和办理个人证件都是需要的&#xff0c;很多时候需要纸质照片&#xff0c;如果我们手头有打印机的话就很方便了&#xff0c;但相纸都是固定尺寸的例如5寸、6寸相纸&#xff0c;而数码证件照的尺寸则不固定&#xff0c;…

第二证券:被举牌一般会有几个涨停?

跟着股市的昌盛&#xff0c;越来越多的人初步查验出资&#xff0c;而其中一个备受注重的策略就是“举牌”。举牌是指某个股东对股票达到了必定比例的控制权&#xff0c;并告诉公司的一种行为。这种行为除了会对公司股价构成影响之外&#xff0c;还可以让股民猜疑和进一步价格走…

蓝牙特征值示例1-迈金L308自行车尾灯夜骑智能表情尾灯的

了解商品级蓝牙特征值 1 服务器&#xff08;设备&#xff09;描述 0x02-01-06 05-03-0F180A18 09-FF-FFFF166B001C0101 0A-09-4C3330385F37393937 01设备标识 03服务UUID FF厂商自定义数据(厂家编号&#xff1a;FFFF-166B001C0101) 完整设备名称&#xff1a; L308-7997 2 服…

Vue 3.0 + vite + axios+PHP跨域问题的解决办法

最后一个Web项目&#xff0c;采用前后端分离。 前端&#xff1a;Vue 3.0 viteelement plus 后端&#xff1a;PHP 运行时前端和后端是两个程序&#xff0c;前端需要时才向后端请求数据。由于是两个程序&#xff0c;这就会出现跨域问题。 比如前端某个地方需要请求的接口如下…

51单片机+DS1302设计一个电子钟(LCD1602显示时间)

一、前言 电子钟是一种能够准确显示时间的设备&#xff0c;广泛应用于家庭、办公场所和公共场所&#xff0c;为人们提供了方便和准确的时间信息。本项目设计一个基于51单片机的电子钟&#xff0c;使用DS1302作为RTC时钟芯片&#xff0c;LCD1602作为显示屏&#xff0c;并通过串…

安装MinGW并在codeblocks下使用

一、下载安装MinGW 1.下载MinGw安装器&#xff0c;下载地址 2. 安装 下载下来的知识一个安装器&#xff0c;我们双击安装会帮我们自动下载好相关文件 安装完成后会打开一个安装管理工具&#xff0c;在这个工具中我们选中想要安装的软件包然后安装到本地 选好以后在菜单栏选…

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

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

DISSECT

XAE 学习架构 OGB means ‘Orthogonal Gate Block’&#xff0c;shared (A ∗ ^∗ ∗, B ∗ ^∗ ∗) and unshared (A ⊥ ^⊥ ⊥, B ⊥ ^⊥ ⊥) information&#xff0c;Φ是编码器&#xff0c;Ψ是解码器 辅助信息 作者未提供代码

【ERROR】ERR_PNPM_NO_IMPORTER_MANIFEST_FOUND No package.json

1、报错 启动项目的时候&#xff0c;报这个错误&#xff0c;是因为根目录错误&#xff0c;查看&#xff0c;根目录是否错误。

Java系列之 查看某一部分代码执行时间长短

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 System.currentTimeMillis();//获取当前的总…

【运维 监控】Grafana + Prometheus,监控Linux

安装和配置Grafana与Prometheus需要一些步骤&#xff0c;下面是一个简单的指南&#xff1a; 安装 Prometheus&#xff1a; 使用包管理器安装 Prometheus。在 Debian/Ubuntu 上&#xff0c;可以使用以下命令&#xff1a; sudo apt-get update sudo apt-get install prometheus在…

Leetcode1334. 阈值距离内邻居最少的城市

Every day a Leetcode 题目来源&#xff1a;1334. 阈值距离内邻居最少的城市 解法1&#xff1a;Floyd 算法 使用 Floyd 算法得到任意两点之间的最短路&#xff0c;然后统计每一个节点满足条件&#xff08;距离在 distanceThreshold 以内&#xff09;的邻居数量。 代码&…

记一次 .NET 某券商论坛系统 卡死分析

一&#xff1a;背景 1. 讲故事 前几个月有位朋友找到我&#xff0c;说他们的的web程序没有响应了&#xff0c;而且监控发现线程数特别高&#xff0c;内存也特别大&#xff0c;让我帮忙看一下怎么回事&#xff0c;现在回过头来几经波折&#xff0c;回味价值太浓了。 二&#…

鼎捷PLM:引领国产替代,创造极致体验,探索数字化研发可行之路

目录 01 直击痛点&#xff0c;鼎捷PLM重塑研发价值链 02 从实际需求出发&#xff0c;支持创新研发 ① 正向的设计思维 ② 智能化的产品设计 ③ 支持大规模定制的设计 03 广域协同&#xff0c;全供应链快速响应研发 04 精益管理&#xff0c;研发体系化、企业低碳化 05 生…

Java实现DXF文件转换成PDF

代码实现 public static void dxfToPdf(){// 加载DXF文件String inputFile "input.dxf";CadImage cadImage (CadImage) Image.load(inputFile);// 设置PDF输出选项PdfOptions pdfOptions new PdfOptions();pdfOptions.setPageWidth(200);pdfOptions.setPageHeigh…

vue echart 立体柱状图 带阴影

根据一个博主代码改编而来 <template><div class"indexBox"><div id"chart"></div></div> </template><script setup> import * as echarts from "echarts"; import { onMounted } from "vue&…