PetShop4.0的消息处理

最新学到PetShop4.0的订单处理,发现了个东西,消息队列,不过在网上搜索大多数都是一些系统的消息队列应用,使用还必须在控制面板  - 添加删除程序 -  Windows组件 消息队列 安装,挺麻烦的。

最后在CSDNTAG中搜索到几篇关于PetShop4.0的消息处理方法.

下面文章是根据原文http://blog.csdn.net/winderxp/archive/2007/04/06/1554237.aspx摘录的

PetShop4.0中,使用了Microsoft Messaging Queue(MSMQ)技术来完成异步处理,利用消息队列临时存放要插入的数据,使得数据访问因为不需要访问数据库从而提供了访问性能,至于队列中的数据,则等待系统空闲的时候再进行处理,将其最终插入到数据库中。

PetShop4.0中的消息处理,主要分为如下几部分:消息接口IMessaging、消息工厂MessagingFactoryMSMQ实现MSMQMessaging以及数据后台处理应用程序OrderProcessor
从模块化分上,PetShop自始自终地履行了面向接口设计的原则,将消息处理的接口与实现分开,并通过工厂模式封装消息实现对象的创建,以达到松散耦合的目的。
由于在PetShop中仅对订单的处理使用了异步处理方式,因此在消息接口IMessaging中,仅定义了一个IOrder接口.

在对消息接口的实现中,考虑到未来的扩展中会有其他的数据对象会使用MSMQ,因此定义了一个Queue的基类,实现消息ReceiveSend的基本操作.

Order类的Receive()方法中,是用new关键字而不是override关键字来重写其父类PetShopQueueReceive()虚方法。因此,如果是实例化如下的对象,将会调用PetShopQueueReceive()方法,而不是子类OrderReceive()方法:
PetShopQueue queue = new Order();
queue.Receive();
从设计上来看,由于PetShop采用面向接口设计的原则,如果我们要创建Order对象,应该采用如下的方式:
IOrder order = new Order();
order.Receive();
考虑到IOrder的实现有可能的变化,PetShop仍然利用了工厂模式,将IOrder对象的创建用专门的工厂模块进行了封装.

在类QueueAccess中,通过CreateOrder()方法利用反射技术创建正确的IOrder类型对象

之所以利用工厂模式来负责对象的创建,是便于在业务层中对其调用,例如在BLL模块中OrderAsynchronous

    /// <summary>

    /// 该类实现了IOrderStrategy 接口成员,主要用于处理异步订单插入

    /// </summary>

    public class OrderAsynchronous : IOrderStrategy

    {

        // 创建数据访问层中用于实现订单消息访问功能的Order 类实例

        private static readonly PetShop.IMessaging.IOrder asynchOrder = PetShop.MessagingFactory.QueueAccess.CreateOrder();

 

        /// <summary>

        /// 实现订单消息发送

        /// </summary>

        /// <param name="order">订单对象OrderInfo </param>

        public void Insert(PetShop.Model.OrderInfo order) {

 

            asynchOrder.Send(order);

        }

    }

一旦IOrder接口的实现发生变化,这种实现方式就可以使得客户仅需要修改配置文件,而不需要修改代码,如此就可以避免程序集的重新编译和部署,使得系统能够灵活应对需求的改变。例如定义一个实现IOrder接口的SpecialOrder,则可以新增一个模块,如PetShop.SpecialMSMQMessaging,而类名则仍然为Order,那么此时我们仅需要修改配置文件中OrderMessaging的值即可:
<add key="OrderMessaging" value="PetShop.SpecialMSMQMessaging"/>
OrderProcessor
是一个控制台应用程序,不过可以根据需求将其设计为Windows Service。它的目的就是接收消息队列中的订单数据,然后将其插入到OrderInventory数据库中。它利用了多线程技术,以达到提高系统性能的目的。

OrderProcessor应用程序中,主函数Main用于控制线程,而核心的执行任务则由方法ProcessOrders()实现.

首先,它会通过PetShop.BLL.Order类的公共方法ReceiveFromQueue()来获取消息队列中的订单数据,并将其放入到一个ArrayList对象中,然而再调用PetShop.BLL.Order类的Insert方法将其插入到OrderInventory数据库中。
PetShop.BLL.Order类中,并不是直接执行插入订单的操作,而是调用了IOrderStrategy接口的Insert()方法.
 
Microsoft Messaging Queue(MSMQ)
技术除用于异步处理以外,它主要还是一种分布式处理技术。分布式处理中,一个重要的技术要素就是有关消息的处理,而在System.Messaging命名空间中,已经提供了Message类,可以用于承载消息的传递,前提上消息的发送方与接收方在数据定义上应有统一的接口规范。
MSMQ
在分布式处理的运用,在我参与的项目中已经有了实现。在为一个汽车制造商开发一个大型系统时,分销商Dealer作为.Net客户端,需要将数据传递到管理中心,并且该数据将被OracleEBS(E-Business System)使用。由于分销商管理系统(DMS)采用的是C/S结构,数据库为SQL Server,而汽车制造商管理中心的EBS数据库为Oracle。这里就涉及到两个系统之间数据的传递。

    
首先Dealer的数据通过MSMQ传递到MSMQ Server,此时可以将数据插入到SQL Server数据库中,同时利用FTP将数据传送到专门的文件服务器上。然后利用IBMEAI技术(企业应用集成,Enterprise Application Itegration)定期将文件服务器中的文件,利用接口规范写入到EAI数据库服务器中,并最终写道EBSOracle数据库中。
上述架构是一个典型的分布式处理结构,而技术实现的核心就是MSMQEAI。由于我们已经定义了统一的接口规范,在通过消息队列形成文件后,此时的数据就已经与平台无关了,使得在.Net平台下的分销商管理系统能够与OracleEBS集成起来,完成数据的处理。 

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值