MSMQ的简单包装类
来源:互联网 发布:宏观经济数据公布时间 编辑:程序博客网 时间:2024/06/12 01:13
最近小小地研究了一下MSMQ,如果把MSMQ用的灵活自如,炉火纯青那要花大功夫了,而且不能简单的用.net提供的MessageQueue类了,这个类提供的功能太少。下面的包装类只提供了插入新数据到MSMQ和从MSMQ取数据,还有一个小特色,可以限制Queue里数据数目,如果达到指定数量,就sleep一段时间。
首先,加入引用System.Messaging.dll, 以及Interop所使用的com:Microsoft Message Queue 3.0 Object Libray.
代码如下:
首先,加入引用System.Messaging.dll, 以及Interop所使用的com:Microsoft Message Queue 3.0 Object Libray.
代码如下:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Messaging;
- using System.Runtime.InteropServices;
- namespace Common
- {
- public class MSMQ<T> : IDisposable
- {
- MessageQueue queue = null;
- int upperLimit = 0;
- public MSMQ(string qName)
- : this(qName, 0)
- {
- }
- public MSMQ(string qName, int limit)
- {
- if (!string.IsNullOrEmpty(qName) && !MessageQueue.Exists(qName))
- {
- MessageQueue.Create(qName, true);
- }
- queue = new MessageQueue(qName);
- upperLimit = limit;
- }
- public T Pop()
- {
- T element = default(T);
- try
- {
- // 30秒内获取Message,超过30秒会引发超时异常
- using (Message m = queue.Receive(new TimeSpan(0, 0, 30)))
- {
- m.Formatter = new XmlMessageFormatter(new Type[] { typeof(T) });
- element = (T)m.Body;
- }
- }
- catch (MessageQueueException exp)
- {
- if (CurrentCount != 0)
- Console.WriteLine(exp.Message);
- }
- return element;
- }
- internal void Push(T[] elements)
- {
- if (elements != null)
- {
- foreach (T element in elements)
- {
- Push(element);
- }
- }
- }
- public void Push(T element)
- {
- using (MessageQueueTransaction ms = new MessageQueueTransaction())
- {
- ms.Begin();
- using (System.Messaging.Message message = new System.Messaging.Message())
- {
- message.Body = element;
- message.Formatter = new System.Messaging.XmlMessageFormatter(new Type[] { typeof(T) });
- // Put message into queue
- queue.Send(message, ms);
- }
- ms.Commit();
- }
- //若达到设定的上限,sleep一分钟.
- while (upperLimit != 0 && (CurrentCount >= upperLimit))
- {
- System.Threading.Thread.Sleep(60000);
- }
- }
- private int CurrentCount
- {
- get
- {
- MSMQ.MSMQManagement msmq = new MSMQ.MSMQManagement();
- object server = null;
- object path = queue.Path;
- object format = null;
- msmq.Init(ref server, ref path, ref format);
- int count = msmq.MessageCount;
- Marshal.ReleaseComObject(msmq);
- return count;
- }
- }
- #region IDisposable Members
- public void Dispose()
- {
- if (queue != null)
- queue.Dispose();
- if (logger != null)
- logger.Dispose();
- }
- #endregion
- }
- }
- MSMQ的简单包装类
- MSMQ稍复杂的包装类
- MSMQ的简单介绍
- MSMQ的简单介绍
- MSMQ的简单应用
- 简单的msmq例子
- MSMQ的简单介绍(收藏)
- c# msmq的简单操作
- 包装类的简单使用
- 一个简单的MSMQ的发送和接收类
- mysql 的一个简单的包装类
- 一个简单的libmad包装类
- 一个简单的libmad包装类
- 一个简单的libmad包装类
- No.2 -->包装类的简单介绍及包装类的应用
- Java的简单类型包装
- oracle OCCI 的一个简单的包装类的实现
- 一个简单的字符输入流包装类
- DataGridView加序号列
- ASP.NET 2.0 Login控件使用技巧(二) - 角色管理
- 帮帮忙 ,vc++6.0引用控件的一个问题,急!!!!
- 类的成员初始化顺序
- Reporting Service 设置中文Bar
- MSMQ的简单包装类
- 我的研究体验--转浙大杨骏的研究心得(比较实在的)
- SQL嵌套查询总结 潇湘博客
- 详细说明mantis在windowsXP下的安装过程(IIS+MYSQL+PHP)
- 企业网站营销策划-第二步网站推广
- 网站推广方式大收集
- 践踏
- 不同数据库取前几个字段的方法
- 一个mm和各路神仙的对话