在队列里存放有N条消息,需要能在页面里把这些消息显示出来,并能对这些消息进行删除操作

解决方案 »

  1.   

    /******************************************************************
     * 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; }
            }
        }
    }
      

  2.   

    读的话msdn上有例子   删除的话就不用了 读一条他就会自己少一条
      

  3.   

    现在我需要做的是,如果有坏死的消息存在于队列中,需要手动删除掉to flyaqiao(KiteReport(http://www.kitesoft.cn))
    MessageQueueHelper<T> 这个 <T> 请教一下,是否是参数,还是什么?
      

  4.   

    T是你要执行操作的 类型
    比如你 int string object 或你自己定义的类....
      

  5.   

    还是有点不懂
    既然 T 是执行操作的类型
    那 public class MessageQueueHelper<T> : MarshalByRefObject where T : class, new()
    这里 怎么会两次继承,能解释下吗
      

  6.   

    如果你用的是VS2003就不用着急看泛型了,Messing.MessageQueue,你仔细看看这个就可以了。
      

  7.   

    to JavaK() 
    我用的是2003,现在是可以查看了,不过就是不能单个删除
    因为我需要实现的是,把在队列里所有还未接收的消息显示出来,并查看其内容来确定是否删除该条消息.
    看了System.Messaging ,好象并没有提到有 可以单个删除的方法
    只有Delete 删除队列,或 Purge 清除队列里全部消息的方法
    不知道,是否可以实现,单个删除
      

  8.   

    .net 里面封装了
    MSDN Webcast里面有讲解的