原创:一个操作Message Queue的辅助类

 

/******************************************************************
 * Copyright(c)  KiteSoft Studio
 * Description   : MessageQueue helper class
 * CreateDate    : 2006-05-11 02:28:58
 * Creater       : Johnson Cao
 * LastChangeDate: 2007-04-11
 * LastChanger   : Johnson Cao
 * Version Info  : 1.1
 * Email                 : KiteSupport@gmail.com
 * *****************************************************************
*/

using  System;
using  System.Collections.Generic;
using  System.Text;
using  System.Messaging;

namespace  KiteSoft.Utils
{
    
/// <summary>
    
/// Message Queue helper class
    
/// </summary>
    
/// <typeparam name="T"></typeparam>

    public class MessageQueueHelper<T> : MarshalByRefObject where T : classnew()
    
{
        
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(
thisnew 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; }
        }

    }

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值