RabbitMQ帮助类的封装

RabbitMQ帮助类的封装

基本部分

public class RabbitMQInvoker
{#region Identy private static IConnection _CurrentConnection = null;private readonly string _HostName = null;private readonly string _UserName = null;private readonly string _Password = null;#endregionpublic RabbitMQInvoker(string hostName = "localhost", string userName = "guest", string password = "guest"){this._HostName = hostName;this._UserName = userName;this._Password = password;}......
}

初始化链接

	#region 初始化链接 private static object RabbitMQInvoker_InitLock = new object();private void InitConnection(){if (_CurrentConnection == null || !_CurrentConnection.IsOpen){lock (RabbitMQInvoker_InitLock){if (_CurrentConnection == null || !_CurrentConnection.IsOpen){var factory = new ConnectionFactory(){HostName = this._HostName,Password = this._Password,UserName = this._UserName};_CurrentConnection = factory.CreateConnection();}}}}#endregion

初始化交换机

	#region 初始化交换机 private static Dictionary<string, bool> RabbitMQInvoker_ExchangeQueue = new Dictionary<string, bool>();private static object RabbitMQInvoker_BindQueueLock = new object();/// <summary>/// 必须先声明exchange--检查+初始化/// </summary>/// <param name="rabbitMQConsumerModel"></param>private void InitExchange(string exchangeName){if (!RabbitMQInvoker_ExchangeQueue.ContainsKey($"InitExchange_{exchangeName}"))//没用api确认{lock (RabbitMQInvoker_BindQueueLock){if (!RabbitMQInvoker_ExchangeQueue.ContainsKey($"InitExchange_{exchangeName}")){this.InitConnection();using (IModel channel = _CurrentConnection.CreateModel()){channel.ExchangeDeclare(exchange: exchangeName, type: ExchangeType.Fanout, durable: true, autoDelete: false, arguments: null);}RabbitMQInvoker_ExchangeQueue[$"InitExchange_{exchangeName}"] = true;}}}}/// <summary>/// 初始化绑定关系/// </summary>/// <param name="rabbitMQConsumerModel"></param>private void InitBindQueue(RabbitMQConsumerModel rabbitMQConsumerModel){if (!RabbitMQInvoker_ExchangeQueue.ContainsKey($"InitBindQueue_{rabbitMQConsumerModel.ExchangeName}_{rabbitMQConsumerModel.QueueName}")){lock (RabbitMQInvoker_BindQueueLock){if (!RabbitMQInvoker_ExchangeQueue.ContainsKey($"InitBindQueue_{rabbitMQConsumerModel.ExchangeName}_{rabbitMQConsumerModel.QueueName}")){this.InitConnection();using (IModel channel = _CurrentConnection.CreateModel()){channel.ExchangeDeclare(exchange: rabbitMQConsumerModel.ExchangeName, type: ExchangeType.Fanout, durable: true, autoDelete: false, arguments: null);channel.QueueDeclare(queue: rabbitMQConsumerModel.QueueName, durable: true, exclusive: false, autoDelete: false, arguments: null);channel.QueueBind(queue: rabbitMQConsumerModel.QueueName, exchange: rabbitMQConsumerModel.ExchangeName, routingKey: string.Empty, arguments: null);}RabbitMQInvoker_ExchangeQueue[$"InitBindQueue_{rabbitMQConsumerModel.ExchangeName}_{rabbitMQConsumerModel.QueueName}"] = true;}}}}#endregion

发送信息

	#region 发送消息/// <summary>/// 只管exchange---/// 4种路由类型?/// /// Send前完成交换机初始化/// </summary>/// <param name="exchangeName"></param>/// <param name="message">建议Json格式</param>public void Send(string exchangeName, string message){this.InitExchange(exchangeName);if (_CurrentConnection == null || !_CurrentConnection.IsOpen){this.InitConnection();}using (var channel = _CurrentConnection.CreateModel())//开辟新的信道通信{try{channel.TxSelect();//开启Tx事务---RabbitMQ协议级的事务-----强事务var body = Encoding.UTF8.GetBytes(message);channel.BasicPublish(exchange: exchangeName,routingKey: string.Empty,basicProperties: null,body: body);channel.TxCommit();//提交Console.WriteLine($" [x] Sent {body.Length}");}catch (Exception ex){Console.WriteLine(ex.Message);Console.WriteLine($"【{message}】发送到Broker失败!{ex.Message}");channel.TxRollback(); //事务回滚--前面的所有操作就全部作废了。。。。}}}#endregion

接收信息

	#region Receive/// <summary>/// 注册处理动作/// </summary>/// <param name="rabbitMQConsumerMode"></param>/// <param name="func"></param>public void RegistReciveAction(RabbitMQConsumerModel rabbitMQConsumerMode, Func<string, bool> func){this.InitBindQueue(rabbitMQConsumerMode);Task.Run(() =>{using (var channel = _CurrentConnection.CreateModel()){var consumer = new EventingBasicConsumer(channel);channel.BasicQos(0, 0, true);consumer.Received += (sender, ea) =>{string str = Encoding.UTF8.GetString(ea.Body.ToArray());if (func(str)){channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false);//确认已消费}else{channel.BasicReject(deliveryTag: ea.DeliveryTag, requeue: true);//放回队列--重新包装信息,放入其他队列}};channel.BasicConsume(queue: rabbitMQConsumerMode.QueueName,autoAck: false,//不ACKconsumer: consumer);Console.WriteLine($" Register Consumer To {rabbitMQConsumerMode.ExchangeName}-{rabbitMQConsumerMode.QueueName}");Console.ReadLine();Console.WriteLine($" After Register Consumer To {rabbitMQConsumerMode.ExchangeName}-{rabbitMQConsumerMode.QueueName}");}});}#endregion

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

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

相关文章

开篇词 | 「安卓学习路线」

操作系统 Java 集合、反射、泛型、并发编程&#xff08;线程安全&#xff0c;锁机制、线程隔离&#xff09;&#xff0c;IO 流&#xff0c;JVM&#xff08;内存结构、垃圾回收&#xff09; 安卓&#xff08;通过实践项目来学习基础知识&#xff09; 基础知识 Activity 和 Ser…

HTML5——基础知识及使用

HTML 文件基本结构 <html><head><title>第一个页面</title></head><body>hello world</body> </html> html 标签是整个 html 文件的根标签(最顶层标签).head 标签中写页面的属性.body 标签中写的是页面上显示的内容.title 标…

Ansible自动化运维学习——综合练习

目录 (一)练习一 1.新建一个role——app 2.创建文件 3.删除之前安装的httpd服务和apache用户 4.准备tasks任务 (1)创建组group.yml (2)创建用户user.yml (3)安装程序yum.yml (4)修改模板httpd.conf.j2 (5)编写templ.yml (6)编写start.yml (7)编写copyfile.yml (8…

Python爬虫技术及其原理详解

概要 随着互联网的发展&#xff0c;大量的数据被存储在网络上&#xff0c;而我们需要从中获取有用的信息。Python作为一种功能强大且易于学习的编程语言&#xff0c;被广泛用于网络爬虫的开发。本文将详细介绍Python爬虫所需的技术及其原理&#xff0c;并提供相关的代码案例。 …

【牛客】4. 01串修改

腾讯音乐娱乐集团2023校园招聘技术类岗位编程题四 【牛客】4. 01串修改 给定一个只包含’0’和’1’两种字符的字符串&#xff0c;每次操作可以选择相邻的两个字符&#xff0c;将它们同时变成’0’或者同时变成’1’。请问最少多少次操作后&#xff0c;所有的字符都相同&…

Mac电脑文件夹无权限问题

sudo cp 16.5.zip /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport 走到之前的folder &#xff0c;右键选择get info更改權限, 再應用到所有子文件夹 右下解鎖再加自己Read & Write, -右邊拉下應該可以應用到所有子文件 这样就可以…

ES6——Iterator 和 for...of 循环

Iterator:遍历器 是一接口&#xff0c;为不同的数据结构提供统一的访问机制&#xff0c;只要当前数据结构部署了iterator接口&#xff0c;当前数据结构就可以遍历。 作用&#xff1a;1、为不同的数据结构&#xff0c;提供统一的访问机制 2、使当前数据结构的成员依次被访问 3…

[信号与系统系列] 复指数信号

正弦信号的向量表示 正弦信号由幅值、频率和初相位三个要素确定。由于在线性正弦稳态电路中&#xff0c;各处的电流和电压都是正弦信号&#xff0c;并且它们的角频率与正弦的角频率相同&#xff0c;因此&#xff0c;在进行正弦稳态电路分析时&#xff0c;对于正弦信号的幅值和…

真实节点、虚拟节点与影子节点的区别

真实节点、虚拟节点与影子节点的区别 本文将深入介绍真实节点、虚拟节点与影子节点是如何协同工作共同创建一个高性能的文档对象模型。 DOM&#xff08;Document Object Module文档对象模型&#xff09;正如它所描述的那样。网站的 HTML 树由一个名为document的对象表示。在这…

C语言学习笔记 码云及git使用教程-05

目录 一、码云简介 二、码云注册 1.点击右上角的注册按钮 2.填写相应的注册信息 3.使用账号密码进行登陆 三、创建仓库 1.如图新建 2.定义仓库相应参数 3.初始化readme文件 4.效果 5.开源设置 四、git管理 1.安装git 2.打开桌面上的Git bash 3.进行仓库克隆 4. 在其他盘…

查找和二叉树(基础知识和基本操作)

查找&#xff1a; 1.二分查找&#xff1a;先定一个大范围&#xff0c;想一个数&#xff0c;看是在起始范围到中间范围还是中间范围到结束范围&#xff0c;依次循环直到确定值&#xff08;相当于一直把范围折半&#xff0c;直到找到&#xff09; while(low<high) {int mid(…

基于UDP的可靠传输,文件+目录(C++,Qt)

一、基础知识 UDP&#xff08;UserDatagramProtocol&#xff09;是一个简单的面向消息的传输层协议&#xff0c;尽管UDP提供标头和有效负载的完整性验证&#xff08;通过校验和&#xff09;&#xff0c;但它不保证向上层协议提供消息传递&#xff0c;并且UDP层在发送后不会保留…

pandas数据清洗常用方法总结

数据清洗常用方法 一、数据读取与保存二、数据查看三、索引设置与修改四、选择与过滤五、缺失值重复值处理六、异常值处理七、行列增加与删除八、拼接与合并九、统计与排序十、重塑与轴向旋转十一、数据运算十二、数据类型变换十三、分组运算 一、数据读取与保存 pd.read_csv(…

K8S初级入门系列之一-概述

一、前言 K8S经过多年的发展&#xff0c;构建了云原生的基石&#xff0c;成为了云原生时代的统治者。我将用三个博客系列全面&#xff0c;循序渐进的介绍K8S相关知识。 初级入门系列&#xff0c;主要针对K8S初学者&#xff0c;以及希望对K8S有所了解的研发人员&#xff0c;重点…

机器学习术语解析与应用(二)

文章目录 &#x1f340;目标函数&#xff08;Objective Function&#xff09;&#x1f340;GPU加速&#xff08;GPU Acceleration&#xff09;&#x1f340;迁移学习&#xff08;Transfer Learning&#xff09;&#x1f340;自然语言处理&#xff08;Natural Language Processi…

1 快速构建mybatis项目

1.1 使用Maven的quickstart框架 注意是不出现w的quickstart&#xff1a; 1.2 加入依赖 <dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</s…

设计模式之策略模式

定义一系列的算法&#xff0c;把他们一个个封装起来&#xff0c;并且使他们可以相互替代。本模式使得算法可独立于使用它的客户而变化! 痛点 策略模式可以很好解决众多if问题 如以下&#xff1a; package com.tao.YanMoDesignPattern.Strategy.notPattern;/*** Author Mi_Ta…

如何让ChatGPT学习私有化知识,并且保留部分对话功能

问题情境 情景&#xff1a;比如我希望用 GPT 做一个产品的客服&#xff0c;现在有一些相关文档&#xff0c;如何让 GPT 学习到产品信息呢&#xff1f; 并且还具备正常对话功能 一个方案是直接把产品信息当做输入喂给GPT&#xff0c;但是ChatGPT/GPT-4/LLMs 一般都有输入长度的…

安装 PyCharm

网址&#xff1a;Download PyCharm: Python IDE for Professional Developers by JetBrains 安装文件&#xff1a; 第一步&#xff1a; 第二步&#xff1a; 第三步&#xff1a; 第四步&#xff1a; 正在安装&#xff1a; 安装完成&#xff1a;

pytest钩子函数(三):用例收集钩子

前言 pytest这个框架提供了非常多的钩子。通过这些钩子我们可以对pytest 用例收集、用例执行、报告输出等各个阶段进行干预&#xff0c;根据需求去开发对应的插件&#xff0c;以满足自己的使用场景。 01 什么是钩子函数&#xff1f; 钩子函数在pytest称之为Hook函数,它pytes…