【讲故事】

自2022年末推出此工具以来,相关文章已被圈内顶尖的几家.NET头条号转载,而且短短数月,已有超100个团队/个人开发者使用它来操控RabbitMQ消息队列,反响可谓十分火爆。故本次经典重现,以飨读者。

【正文】

支持.Net Core(2.0及以上)/.Net Framework(4.5及以上),可以部署在Docker, Windows, Linux, Mac。

RabbitMQ作为一款主流的消息队列工具早已广受欢迎。相比于其它的MQ工具,RabbitMQ支持的语言更多、功能更完善。

本文提供一种市面上最/极简单的使用RabbitMQ的方式,只需要会调用以下三个方法,你就几乎可以掌握整个RabbitMQ的使用:

(1)SendMessage,发送一个消息

(2)GetMessage,获取一个消息

(3)UseMessage,使用一个消息(连续使用)

为了调用以上三个方法,首先需要从NuGet引用DeveloperSharp.RabbitMQ包,并在App.config/Web.config里面添加如下配置(.NET6 / VS2022中已有App.config这个单项添加):

  <appSettings>
<add key="RabbitMQConnectionString" value="hostName=135.208.12.236,port=5672,userName=sa,password=aevin.gang" />
</appSettings>

说明:上述配置中分别设置了RabbitMQ应用所在的服务器IP地址hostName、端口port、用户名userName、密码password(请把这四项的对应值修改成你自己那边的RabbitMQ的对应值)

下面,我们给出一个使用了上述SendMessage、GetMessage、UseMessage三个方法的示例。该示例的功能说明如下:

  • 先向RabbitMQ服务器上名为“aa”的队列发送了5个消息,

  • 然后从RabbitMQ服务器上的“aa”队列中获取,并打印出第1个消息,

  • 最后再连续从RabbitMQ服务器上的“aa”队列中获取剩余4个消息,并把它们写入名为fj.txt的文件。

代码如下:

using DeveloperSharp.RabbitMQ;
-------------------------- static void Main(string[] args)
{
//发送5个消息(使用SendMessage)
RabbitMQHelper.SendMessage("aa", "世界1,你好!");
RabbitMQHelper.SendMessage("aa", "世界2,你好!");
RabbitMQHelper.SendMessage("aa", "世界3,你好!");
RabbitMQHelper.SendMessage("aa", "世界4,你好!");
RabbitMQHelper.SendMessage("aa", "世界5,你好!"); //获取1个消息(使用GetMessage)
string OneMessage = RabbitMQHelper.GetMessage("aa").Message;
Console.WriteLine(OneMessage); //向fj.txt这个文本文件中写入剩余的4个消息(使用UseMessage)
RabbitMQHelper.UseMessage("aa", t =>
{
System.IO.File.AppendAllText("D:/fj.txt", t.Message);
return true;
});
}

运行结果如下:

【控制台显示出】:世界1,你好!

【fj.txt文件中显示出】:世界2,你好!世界3,你好!世界4,你好!世界5,你好!

三个方法的详细功能说明(辅助参考):

(1)发送一个消息
void SendMessage(string QueueName, string Message, Dictionary<string, object> Header = null) (2)获取一个消息
RabbitMQMessage GetMessage(string QueueName) (3)使用一个消息(连续使用)
void UseMessage(string QueueName, Func<RabbitMQMessage, bool?> Use)
附加说明:
(I)Use返回值为true时,代表当前消息已被有效处理并会被服务器删除。然后程序自动进入下一条消息的使用。
若Use返回值为false时,代表当前消息未被有效处理但仍会被服务器删除。然后程序自动进入下一条消息的使用。
若Use返回值为null时,代表当前消息会被服务器重新队列分配到其它可用的实例上再处理。然后程序自动进入下一条消息的使用。
若Use内部发生未被处理的异常,程序会停止。
(II)RabbitMQMessage对象定义如下:
public class RabbitMQMessage
{
public string Message;
public IDictionary<string, object> Header;
public string Id; //此处系统自动生成的Id具有分布式唯一Id的特性。
}

运行有问题,需要技术支持?请添加微信:894988403

运行有问题,需要技术支持?请添加微信:894988403

延时队列&死信队列

有些场景下,我们希望为使用的消息设定有效期。在有效期内,这些消息有效可用;但过期后,这些消息将变得无效不可用,同时,它们还将自动被丢弃进一个称之为“死信”的队列。

为了说明这些概念,我们还是来举一个具体的例子。该例子的功能说明如下:

  • 首先,在RabbitMQ服务器上定义一个名为"bbq"、且其中存放的消息会在60秒后过期失效的队列。

  • 然后,在RabbitMQ服务器上获取与"bbq"队列对应的【死信队列】。并连续从该【死信队列】中获取消息并把它们写入名为BB.txt的文件。

  • 最后,向RabbitMQ服务器上的"bbq"队列发送3个消息。

代码如下:

using DeveloperSharp.RabbitMQ;//从NuGet引用DeveloperSharp.RabbitMQ包
-------------------------- //定义bbq队列,其中存放的消息会在60秒后过期
var myQ = RabbitMQHelper.SetQueue("bbq", 60000); //获取与bbq队列对应的【死信队列】
var expQ = RabbitMQHelper.GetQueue("bbq");
//向BB.txt这个文本文件中连续写入【死信队列】中的消息
expQ.UseMessage(t =>
{
System.IO.File.AppendAllText("D:/BB.txt", t.Message);
return true;
}); //向bbq队列发送3个消息
myQ.SendMessage("jinA");
myQ.SendMessage("jinB");
myQ.SendMessage("jinC"); /*
//【附加题】:若去掉注释让此语句执行,【死信队列】中将不会获得消息(为啥?自己推理)
RabbitMQHelper.UseMessage("bbq", t =>
{
return true;//若此处返回false,【死信队列】将会获得消息
});
*/

运行以上程序:

60秒之内,【BB.txt文件】中没有内容

60秒以后,【BB.txt文件】中显示出:jinAjinBjinC

运行有问题,需要技术支持?请添加微信:894988403

运行有问题,需要技术支持?请添加微信:894988403

通过以上例子,我们可简单预测一下,延时队列&死信队列常用在“限时消费”、“过期处理”等场景。生活中最常见示例如:订单请在10分钟内支付完毕、等等之类功能...

使用消息服务对解耦分布式系统、实现发布/订阅、提高系统性能、等方面都有巨大用处,相信本文会扩展你的思维认知,让你在相关技术解决方案上有更多灵活思路+联想空间!

原文链接:http://www.developersharp.cc/content12.html

服务条款:http://www.developersharp.cc/buy.html

最新文章

  1. [No00008C]图解SQL的各种连接join让你对SQL的连接一目了然
  2. 自动化运维:flask-bootstrap + highstock整合
  3. linux+php+apache+mysql(mariadb)故障排除
  4. word2vec模型原理与实现
  5. Unity3D常用代码总结
  6. 【springBoot】springBoot集成redis的key,value序列化的相关问题
  7. [资源分享]神州数码 思科 UCS 虚拟化培训资料
  8. 使用Gradle构建Android应用内测版本
  9. sqlserver 执行远程数据库代码
  10. 12.java.lang.NoSuchMethodException
  11. 201521123087 《Java程序设计》第3周学习总结
  12. wordpress升级版本时出现错误“Maximum execution time of 30 seconds exceeded”
  13. 正则表达式基于JavaScript的入门详解
  14. 使用python实现深度神经网络 1(转)
  15. visual studio 2019密钥
  16. springboot中使用ContextLoaderListener.getCurrentWebApplicationContext();获取WebApplicationContext为空问题
  17. go标准库的学习-io/ioutil
  18. OneNET麒麟座应用开发之七:控制采样电机
  19. poj2828 Buy Tickets (线段树 插队问题)
  20. JVM内存参数( -Xms -Xmx -Xmn -Xss 直接内存)

热门文章

  1. CodeQL(1)
  2. Atlas人工智能基础知识
  3. mysql 基础明细
  4. 春秋云境 CVE-2022-24663复现
  5. 关于linux mint(nemo)添加右键菜单修改方法
  6. day 19 分组查询 &amp; having和where区别
  7. 【每日一题】【二分mid&amp;贪心】2022年2月8日-NC163 最长上升子序列(一)
  8. 【Spark】Day03-Spark SQL:DataFrame、DataSet、sql编程与转换、项目实战(区域热门商品)
  9. Vue快速上门(3)-组件与复用
  10. 关于RESTful 的使用(实战)