MSDN中介绍说利用消息队列,应用程序开发人员可以通过发送和接收消息方便地与应用程序进行快速可靠的通信。消息处理为您提供了有保障的消息传递和执行许多业务处理的可靠的防故障方法。具体来说,当数据库出现短时异常时,利用消息处理方式,可以对已提交的消息进行恢复,提高系统的可靠性。
下面重点来探讨.Net PetShop 4.0中的订单处理和消息处理。
PetShop.IMessaging
PetShop.MSMQMessaging
PetShop.MessagingFactory
PetShop.IBLLStrategy
PetShop.BLL
PetShop.OrderProcessor
一、PetShop.IMessaging命名空间
PetShop.IMessaging提供了一个接口IOrder,这个接口包含Receive和Send方法。
二、PetShop.MSMQMessaging命名空间
PetShop.MSMQMessaging提供了两个类Order和PetShopQueue。PetShopQueue实现了IDisposable接口,该类中还使用了.NET框架System.Messaging命名空间中的MessageQueue和Message类。
Order类继承PetShopQueue类,并实现IOrder接口。
三、PetShop.MessagingFactory命名空间
PetShop.MessagingFactory提供了一个自封装的类QueueAccess,该类同样实现了工厂模式,只不过这个工厂只生产一个“商品”——PetShop.MSMQMessaging.Order。
四、PetShop.IBLLStrategy命名空间
PetShop.IBLLStrategy提供了一个接口IOrderStrategy,该接口只有一个方法Insert。
五、PetShop.BLL命名空间
PetShop.BLL是.Net PetShop 4.0的业务逻辑层命名空间,其中包含Cart、Order、Item、Product等类,本文只关心其中的三个类:OrderAsynchronous、OrderSynchronous和Order。
OrderAsynchronous和OrderSynchronous是对IOrderStrategy接口的实现,前者是异步方式,后者是同步方式。Order类有三个主要的方法,分别是获取订单GetOrder、插入订单Insert和从队列里接收订单ReceiveFromQueue。
插入订单Insert有两种方式:同步和异步,它通过调用Order类的一个私有方法LoadInsertStrategy产生一个OrderAsynchronous或OrderSynchronous的实例,是工厂模式的又一次应用。
而获取订单GetOrder则是在订单处理完成之后再从数据库中获取的,它只与数据访问层(DAL)有关。由于.Net PetShop 4.0在数据访问层上也使用了工厂模式,因此在这里是通过调用PetShop.DALFactory.DataAccess.CreateOrder()创建一个实例dal,通过调用实例的GetOrder方法获取订单对象。
从队列里接收订单ReceiveFromQueue是在异步方式中使用的,这个方法将在订单处理PetShop.OrderProcessor中调用,在异步方式中将订单保存到数据持久层。
六、PetShop.OrderProcessor命名空间
PetShop.OrderProcessor提供了一个Program类,它是一个控制台程序。只如其注释里所写,在实际应用中,一般更愿意将其作为一个Windows Service程序来实现。它的功能是在异步方式中将订单保存到数据持久层。当然,保存订单还是通过调用业务逻辑层的Order类的Insert方法,将其保存到数据库中的。
需要说明的是,消息队列在Windows中必须进行安装。在控制面析->添加/删除程序->添加/删除Windows 组件中,选择消息队列复选框进行安装。
下面是web.config中有关消息的配置: