在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
在本文的前两篇文章里对MSMQ的相关知识点进行了介绍,很多阅读过这前两篇文章的朋友都曾问到过这样一些问题:
1、如何把MSMQ应用到实际的项目中去呢? 2、可不可以介绍一个实际的应用实例? 3、...... 在前两篇文章里,关于MSMQ常用的技术点基本介绍完毕了,本文主要以MS开源项目PetShop中的MSMQ应用作为案例来介绍MSMQ在实际项目中的 应用。在PetShop里,由于系统使用了多线程的专用应用程序来监控消息队列,在进入PetShop应用分析前,我们先来了解下关于多线程和MSMQ的 相关知识点。
1static private int ThreadNumber = 5; //5个线程序 2static private Thread[] ThreadArray = new Thread[ThreadNumber]; 我们把需要启动的线程装载入ThreadArray数组,通过一个遍历数组把所以的线程启动,实际这里只有5个线程。
1private void button1_Click(object sender, EventArgs e) 2} 如果上面这段代码阅读起存在问题,建议先去了解下多线程的相关知识点。在StartThreads方法里启动数组里存储的所以线程,并委托给MSMQListen方法进行处理,MSMQListen方法完成的就是读取队列里的消息,这里我使用了在第二篇文章里所使用的MsgQueue类和Book类,详细请阅读第二篇文章
1private void button3_Click(object sender, EventArgs e) 2} 那么这里的测试,向队列里发送了一Book对象消息,根据上面分析,则多线程便会同时把此条消息读取出来: 示意性代码:
1namespace PetShop.IBLLStrategy 2 从上面UML和代码就可以看出,订单策略接口下有两种实现,使用了抽象工厂模式来完成相应的订单策略对象的创建 。关于这点在后面消息工厂部分去介绍,这里不作讲解。
1namespace PetShop.MSMQMessaging 2} MSMQ队列是一个可持久的队列,不会因用户不间断的下订单导致数据丢失。queue作为存放数据的队列,为消息队列(MessageQueue)类型, 同时还为PetShopQueue设置了timeout值,后台处理应用程序(OrderProessor)会根据timeout的值定期扫描队列中的订 单数量。
1namespace PetShop.MessagingFactory 2} 在QueueAccess类中,通过CreateOrder方法利用反射技术创建正确IOrder类型对象(实际也就是创建了一个接口的具体实现类的对象,应用了多态的原理和反射技术)。UML图下:
<add key="OrderMessaging" value="PetShop.MSMQMessaging"/>
这里我为了能够更直观的演示和介绍就把path固化定义了,如下:
private static readonly string path = "PetShop.MSMQMessaging";
这里利用工厂模式来负责对象的创建,主要是方便业务逻辑层对定单处理策略的调用,如在PetShop.BLL模块中的OrderSynchronous类:
1namespace PetShop.BLL 2} 这样一但IOrder接口的实现发生了变化,此时就只需要修改配置文件就OK,整个系统就显得很灵活,稳定。
1namespace PetShop.MSMQMessaging 2} UML草图:
1//1、使用基类PetShopQueue 2PetShopQueue order = new Order(); 3order.Receive(); 4 5//2、使用消息接口IOrder 6IOrder order = new Order(); 7order.Receive(); 根据多态原理,上面这两种实现都是正确的,那我们那取谁舍谁呢?在PetShop4.0中正确的调用是第2种方法,这种调用方法也更符合“面向接口设计”的原则。----详细请查看消息工厂MessageFactory部分的介绍。
1private static void ProcessOrders() ProcessOrders方法首先通过业务逻辑层PetShop.BLL.Order类的方法ReceiveFromQueue去获取消息队列中的订单数据,并将其放入一个ArrayList对象,然后将其插入到数据库。 OrderProcessor的完整代码定义如下: 2}
Code
|
请发表评论