新增死信处理 它让你1小时精通RabbitMQ消息队列( 二 )


三个方法的详细功能说明(辅助参考):
(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的特性 。          }延时队列&死信队列
有些场景下,我们希望为使用的消息设定有效期 。在有效期内,这些消息有效可用;但过期后,这些消息将变得无效不可用,同时,它们还将自动进入一个称之为“死信”的队列 。
为了说明这些概念,我们还是来举一个具体的例子 。该例子的功能说明如下:

  • 首先,在RabbitMQ服务器上定义一个名为"bbq"的队列 。且设定此队列中存放的所有消息会在60秒后过期失效 。
  • 然后,在RabbitMQ服务器上定义一个与"bbq"队列对应的死信队列 。并连续从该死信队列中获取消息并把它们写入名为BB.txt的文件 。
  • 最后,向RabbitMQ服务器上的"bbq"队列发送3个消息 。
代码如下:
using 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,死信队列将会获得消息            });            */

经验总结扩展阅读