C#如何查看MSMQ里的消息,并能进行删除操作,有人知道吗? 在队列里存放有N条消息,需要能在页面里把这些消息显示出来,并能对这些消息进行删除操作 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 /****************************************************************** * Copyright(c) Suzsoft DotNet Group * Description : MessageQueue helper class * CreateDate : 2006-05-11 02:28:58 * Creater : QCao * LastChangeDate: * LastChanger : * Version Info : * ******************************************************************/using System;using System.Collections.Generic;using System.Text;using System.Messaging;namespace Suzsoft.Alarming.Service{ /// <summary> /// Message Queue helper class /// </summary> /// <typeparam name="T"></typeparam> public class MessageQueueHelper<T> : MarshalByRefObject where T : class, new() { public MessageQueueHelper(string path) { m_AllowException = true; if (MessageQueue.Exists(path)) m_Msq = new MessageQueue(path); else { m_Msq = MessageQueue.Create(path); m_Msq.MaximumQueueSize = CommonSettings.QueueMaxSize; } m_Msq.SetPermissions("Everyone", System.Messaging.MessageQueueAccessRights.FullControl); m_Msq.Formatter = new XmlMessageFormatter(new Type[] { typeof(T) }); m_Msq.Label = typeof(T).Name; m_Msq.ReceiveCompleted += new ReceiveCompletedEventHandler(Msq_ReceiveCompleted); } ~MessageQueueHelper() { Close(); } private MessageQueue m_Msq; private bool m_AllowException; public bool AllowException { get { return m_AllowException; } set { m_AllowException = value; } } private bool MssageQueueReady() { if (m_Msq == null) if (AllowException) throw new Exception("The message queue is not ready."); else return false; else return true; } public void Send(object msg) { if (!msg.GetType().Equals(typeof(T))) return; if (!MssageQueueReady()) return; try { m_Msq.Send(msg); } catch { // TODO: Send Message queue failed } } public void Send(object msg, string label) { if (!MssageQueueReady()) return; try { m_Msq.Send(msg, label); } catch { // TODO: Send Message queue failed } } public T Receive() { if (!MssageQueueReady()) return default(T); Message m = m_Msq.Receive(MessageQueueTransactionType.Single); return m.Body as T; } public IList<T> ReceiveAll() { if (!MssageQueueReady()) return null; Message[] ms = m_Msq.GetAllMessages(); IList<T> list = new List<T>(); foreach (Message m in ms) { list.Add(m.Body as T); } return list; } public T Peek() { if (!MssageQueueReady()) return default(T); //m_Msq.Formatter = new XmlMessageFormatter(new Type[] { typeof(T) }); Message m = m_Msq.Peek(); return m.Body as T; } public void AsynchronismReceive() { if (!MssageQueueReady()) return; m_Msq.BeginReceive(); } public void EndReceive() { if (!MssageQueueReady()) return; } private void Msq_ReceiveCompleted(object sender, ReceiveCompletedEventArgs e) { MessageQueue mq = (MessageQueue)sender; Message m = mq.EndReceive(e.AsyncResult); if (ReceiveEvent != null) ReceiveEvent(this, new ReceiveEventArgs<T>(m.Body as T)); mq.BeginReceive(); } public event ReceiveEventHandler ReceiveEvent; public delegate void ReceiveEventHandler(object sender, ReceiveEventArgs<T> e); public void Close() { if (m_Msq != null) m_Msq.Close(); } } public class ReceiveEventArgs<T> : EventArgs where T : class { public ReceiveEventArgs(T result) { m_Result = result; } private T m_Result; public T Result { get { return m_Result; } //set { m_Result = value; } } }} 读的话msdn上有例子 删除的话就不用了 读一条他就会自己少一条! 现在我需要做的是,如果有坏死的消息存在于队列中,需要手动删除掉to flyaqiao(KiteReport(http://www.kitesoft.cn))MessageQueueHelper<T> 这个 <T> 请教一下,是否是参数,还是什么? T是你要执行操作的 类型比如你 int string object 或你自己定义的类.... 还是有点不懂既然 T 是执行操作的类型那 public class MessageQueueHelper<T> : MarshalByRefObject where T : class, new()这里 怎么会两次继承,能解释下吗 如果你用的是VS2003就不用着急看泛型了,Messing.MessageQueue,你仔细看看这个就可以了。 to JavaK() 我用的是2003,现在是可以查看了,不过就是不能单个删除因为我需要实现的是,把在队列里所有还未接收的消息显示出来,并查看其内容来确定是否删除该条消息.看了System.Messaging ,好象并没有提到有 可以单个删除的方法只有Delete 删除队列,或 Purge 清除队列里全部消息的方法不知道,是否可以实现,单个删除 .net 里面封装了MSDN Webcast里面有讲解的 c#在数控编程中的应用 WPF在MVVM设计模式下编程遇到的问题 c#web加载ActiveX控件空闲在工具栏中是灰的不可选。是什么问题 求解,web.config设置为StateServer,如何对在线用户进行统计(含用户名)? 新人,求大神帮忙 日期格式转换出错,GMT,超出范围。。。 Remoting中的远程事件回调问题,各位大虾赐教啊!!! 想学UML能不能推荐几本书 求教,GDI+如何绘制下面的图案 关于替换换行的问题 我想问一下,为何非要使用event实现事件? 路过请进,字符串转换为枚举类型,在线等.
* Copyright(c) Suzsoft DotNet Group
* Description : MessageQueue helper class
* CreateDate : 2006-05-11 02:28:58
* Creater : QCao
* LastChangeDate:
* LastChanger :
* Version Info :
* ******************************************************************/
using System;
using System.Collections.Generic;
using System.Text;
using System.Messaging;namespace Suzsoft.Alarming.Service
{
/// <summary>
/// Message Queue helper class
/// </summary>
/// <typeparam name="T"></typeparam>
public class MessageQueueHelper<T> : MarshalByRefObject where T : class, new()
{
public MessageQueueHelper(string path)
{
m_AllowException = true;
if (MessageQueue.Exists(path))
m_Msq = new MessageQueue(path);
else
{
m_Msq = MessageQueue.Create(path);
m_Msq.MaximumQueueSize = CommonSettings.QueueMaxSize;
}
m_Msq.SetPermissions("Everyone", System.Messaging.MessageQueueAccessRights.FullControl); m_Msq.Formatter = new XmlMessageFormatter(new Type[] { typeof(T) });
m_Msq.Label = typeof(T).Name;
m_Msq.ReceiveCompleted += new ReceiveCompletedEventHandler(Msq_ReceiveCompleted);
}
~MessageQueueHelper()
{
Close();
}
private MessageQueue m_Msq;
private bool m_AllowException; public bool AllowException
{
get { return m_AllowException; }
set { m_AllowException = value; }
}
private bool MssageQueueReady()
{
if (m_Msq == null)
if (AllowException)
throw new Exception("The message queue is not ready.");
else
return false;
else
return true;
}
public void Send(object msg)
{
if (!msg.GetType().Equals(typeof(T))) return;
if (!MssageQueueReady()) return;
try
{
m_Msq.Send(msg);
}
catch
{
// TODO: Send Message queue failed
}
}
public void Send(object msg, string label)
{
if (!MssageQueueReady()) return;
try
{
m_Msq.Send(msg, label);
}
catch
{
// TODO: Send Message queue failed
}
}
public T Receive()
{
if (!MssageQueueReady()) return default(T);
Message m = m_Msq.Receive(MessageQueueTransactionType.Single);
return m.Body as T;
}
public IList<T> ReceiveAll()
{
if (!MssageQueueReady()) return null;
Message[] ms = m_Msq.GetAllMessages();
IList<T> list = new List<T>();
foreach (Message m in ms)
{
list.Add(m.Body as T);
}
return list;
}
public T Peek()
{
if (!MssageQueueReady()) return default(T);
//m_Msq.Formatter = new XmlMessageFormatter(new Type[] { typeof(T) });
Message m = m_Msq.Peek();
return m.Body as T;
}
public void AsynchronismReceive()
{
if (!MssageQueueReady()) return;
m_Msq.BeginReceive();
}
public void EndReceive()
{
if (!MssageQueueReady()) return;
}
private void Msq_ReceiveCompleted(object sender, ReceiveCompletedEventArgs e)
{
MessageQueue mq = (MessageQueue)sender;
Message m = mq.EndReceive(e.AsyncResult);
if (ReceiveEvent != null)
ReceiveEvent(this, new ReceiveEventArgs<T>(m.Body as T));
mq.BeginReceive();
}
public event ReceiveEventHandler ReceiveEvent;
public delegate void ReceiveEventHandler(object sender, ReceiveEventArgs<T> e);
public void Close()
{
if (m_Msq != null)
m_Msq.Close();
}
} public class ReceiveEventArgs<T> : EventArgs where T : class
{
public ReceiveEventArgs(T result)
{
m_Result = result;
}
private T m_Result; public T Result
{
get { return m_Result; }
//set { m_Result = value; }
}
}
}
!
MessageQueueHelper<T> 这个 <T> 请教一下,是否是参数,还是什么?
比如你 int string object 或你自己定义的类....
既然 T 是执行操作的类型
那 public class MessageQueueHelper<T> : MarshalByRefObject where T : class, new()
这里 怎么会两次继承,能解释下吗
我用的是2003,现在是可以查看了,不过就是不能单个删除
因为我需要实现的是,把在队列里所有还未接收的消息显示出来,并查看其内容来确定是否删除该条消息.
看了System.Messaging ,好象并没有提到有 可以单个删除的方法
只有Delete 删除队列,或 Purge 清除队列里全部消息的方法
不知道,是否可以实现,单个删除
MSDN Webcast里面有讲解的