--Msmq消息处理器、发送器
消息处理器负责从消息队列里获取消息,并对消息进行装饰,编辑;得到的结果交给发送器,发送器通过Email,Msn,sysLog等媒介把处理后的消息发送出去。。。。
在前2章已经介绍
[置顶]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-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);
}
可能大家现在对工厂里的代码有点迷糊,等下章我们会给大家解开这个迷糊的。