MSMQ消息通知系统之-Msmq消息处理器、发送器

--Msmq消息处理器、发送器

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

 

在前2章已经介绍
[置顶]MSMQ消息通知系统之消息队列多线程监视器

[置顶]MSMQ消息通知系统之消息队列创建、发送、接收

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[消息内容的变种.].

public interface ImsgPoster

    {

        void post(SenderInfo sender);

    }

这样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-1Process 的代码如下:

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);

 

}

 

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

你可能感兴趣的:(MQ)