-Msmq消息处理器、发送器

消息处理器负责从消息队列里获取消息,并对消息进行装饰,编辑;得到的结果交给发送器,发送器通过Email,Msn,sysLog等媒介把处理后的消息发送出去。。。。

在MSMQ消息通知系统之消息队列多线程监视器章节里,我们有个注释为Process的代码。这里就是我们这章要讲的内容。

for (int k = 0; k < queueOrders.Count;
k++)
                            {
                                //process
                                Console.WriteLine("process one");
                                processedItems++;
                                totalOrdersProcessed++;
                            }
               [code-1-1]

假设我们的Msmq处理器、发送器处理的是PetShop4.0订单状态变化的通知。状态的变化我们姑且有:订单生成通知、订单支付成功通知、订单冻结通知、订单异常通知、卖家发货通知、订单取消通知等等!

首先我们对发送器进行分析,顾名思义,发送器就是把处理后的订单信息以Email,Msn,sysLog等消息发送给消费者.那我们先抽象出来一个发送器IMsgPoster接口,接口有一个Post 发送的方法,参数是一个超类SenderInfo[消息内容的变种.].

publicinterface
ImsgPoster
   
{
       
void post(SenderInfo
    }
这样Email,Msn,SysLog均继承该接口,代码如下
public EmailPoster:IMsgPoster
{
public void
Poster(SenderInfo sender)

{     //code
here
} 
}
public MsnPoster:IMsgPoster
{}
public SyslogPoster:IMsgPoster
{}

每一个通知应该对应一个处理器,  首先我们抽象一个Iprocessor的抽象类,这个类使用了观察者模式的思 

abstract public  class Iprocessor
{
    private
IList<IMsgPoster> list=new List<IMsgPoster>();
    protected
void AddMsgPoster(ImsgPoster poster)
    {list.Add(poster);}
public virtual  void Process(MessageBase msg)

{    //code here
foreach(IMsgPoster
p in list)
{
    p.Post(msg);
}
} 
}

那订单生成的Processor应该如下:

public class OrderCreateProcessor:IProcessor
{
    public
override void Process(MessageBase msg)
    {base.Process(msg);}}

我们完善上面code-1-1的代码

Process注释部分大致流程如下:

MessageBase msg=queueOrders[k] as MessageBase;
if(msg!=null)
{
    //创建处理器。
    IProcessor
processor=new    OrderCreateProcessor();
    processor. AddMsgPoster(new
EmailPoster());
    processor. AddMsgPoster(new
MsnPoster());
    //处理消息.
    processor.Process(msg);

 
}

 上面的代码出现了三个new,涉及到了对象的创建,我们就用简单工厂+反射技术来完成对象的创建吧。

工厂类

public sealed class DataAcess
{
    private static
readonly string path=ConfigurationManager.AppSettings[“WebDal”];
    public
static IProcessor CreateProcessor(MessageBase msg)
    {
       ..code
here
}
    public
static IMsgPoster CreateMsgPoster(string poster)
    {
            // recorderPath="SinaEC.Notify
            string className = recorderPath +
"."+poster;
            return (ImsgPoster)Assembly.Load(path).CreateInstance(className);
}

 
}

现在的code-1-1的Process 的代码如下:

MessageBase msg=queueOrders[k] as MessageBase;
if(msg!=null)
{
    //创建处理器。
    IProcessor
processor=DataAcess. CreateProcessor(msg)
    processor. AddMsgPoster(DataAccess.
CreateMsgPoster(“Email”));
    processor. AddMsgPoster(DataAccess.
CreateMsgPoster(“Msn”));
    //处理消息.
    processor.Process(msg);

 
}

可能大家现在对工厂里的代码有点迷糊,等下章我们会给大家解开这个迷糊的。