MSMQ的简单包装类

   最近小小地研究了一下MSMQ,如果把MSMQ用的灵活自如,炉火纯青那要花大功夫了,而且不能简单的用.net提供的MessageQueue类了, 这个类提供的功能太少。下面的包装类只提供了插入新数据到MSMQ和从MSMQ取数据,还有一个小特色,可以限制Queue里数据数目,如果达到指定数量, 就sleep一段时间。

首先,加入引用System.Messaging.dll, 以及Interop所使用的com:Microsoft Message Queue 3.0 Object Libray.




代码如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Messaging;
  6. using System.Runtime.InteropServices;
  7. namespace Common
  8. {
  9.     public class MSMQ<T> : IDisposable
  10.     {
  11.         MessageQueue queue = null;

  12.         int upperLimit = 0;
  13.         public MSMQ(string qName)
  14.             : this(qName, 0)
  15.         {
  16.         }
  17.         public MSMQ(string qName, int limit)
  18.         {
  19.             if (!string.IsNullOrEmpty(qName) && !MessageQueue.Exists(qName))
  20.             {
  21.                 MessageQueue.Create(qName, true);
  22.             }
  23.             queue = new MessageQueue(qName);
  24.             upperLimit = limit;
  25.         }
  26.         public T Pop()
  27.         {
  28.             T element = default(T);
  29.             try
  30.             {
  31.                 // 30秒内获取Message,超过30秒会引发超时异常
  32.                 using (Message m = queue.Receive(new TimeSpan(0, 0, 30)))
  33.                 {
  34.                     m.Formatter = new XmlMessageFormatter(new Type[] { typeof(T) });
  35.                     element = (T)m.Body;
  36.                 }
  37.             }
  38.             catch (MessageQueueException exp)
  39.             {
  40.                 if (CurrentCount != 0)
  41.                     Console.WriteLine(exp.Message);
  42.             }
  43.             return element;
  44.         }
  45.         internal void Push(T[] elements)
  46.         {
  47.             if (elements != null)
  48.             {
  49.                 foreach (T element in elements)
  50.                 {
  51.                     Push(element);
  52.                 }
  53.             }
  54.         }
  55.         public void Push(T element)
  56.         {
  57.             using (MessageQueueTransaction ms = new MessageQueueTransaction())
  58.             {
  59.                 ms.Begin();
  60.                 using (System.Messaging.Message message = new System.Messaging.Message())
  61.                 {
  62.                     message.Body = element;
  63.                     message.Formatter = new System.Messaging.XmlMessageFormatter(new Type[] { typeof(T) });
  64.                     // Put message into queue
  65.                     queue.Send(message, ms);
  66.                 }
  67.                 ms.Commit();
  68.             }
  69.             //若达到设定的上限,sleep一分钟.
  70.             while (upperLimit != 0 && (CurrentCount >= upperLimit))
  71.             {
  72.                 System.Threading.Thread.Sleep(60000);
  73.             }
  74.         }
  75.         private int CurrentCount
  76.         {
  77.             get
  78.             {
  79.                 MSMQ.MSMQManagement msmq = new MSMQ.MSMQManagement();
  80.                 object server = null;
  81.                 object path = queue.Path;
  82.                 object format = null;
  83.                 msmq.Init(ref server, ref path, ref format);
  84.                 int count = msmq.MessageCount;
  85.                 Marshal.ReleaseComObject(msmq);
  86.                 return count;
  87.             }
  88.         }
  89.         #region IDisposable Members
  90.         public void Dispose()
  91.         {
  92.             if (queue != null)
  93.                 queue.Dispose();
  94.             if (logger != null)
  95.                 logger.Dispose();
  96.         }
  97.         #endregion
  98.     }
  99. }






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值