1、petshop的系统架构设计petshop的系统架构设计filedunder∶design(编辑修改稿)内容摘要:

ing 模块中定义的接口 IOrder,同时它还继承了基类 PetShopQueue,其定义如下: public class Order:PetShopQueue, 方法的实现代码如下: public new OrderInfo Receive() { // This method involves in distributed transaction and need Automatic Transaction type =。 return (OrderInfo)((Message)()).Body。 } public OrderInfo Receive(int timeout) { = ((timeout))。 return Receive()。 } public void Send(OrderInfo orderMessage) { // This method does not involve in distributed transaction and optimizes performance using Single type =。 (orderMessage)。 } 所以,最后的类图应该如下: 注意在 Order 类的 Receive()方法中,是用 new 关键字而不是 override关键字来重写其父类 PetShopQueue 的 Receive()虚方法。 因此,如果是实例化如下的对象,将会调用 PetShopQueue 的 Receive()方法,而 不是子类 Order 的Receive()方法: PetShopQueue queue = new Order()。 ()。 从设计上来看,由于 PetShop 采用 “ 面向接口设计 ” 的原则,如果我们要创建 Order 对象,应该采用如下的方式: IOrder order = new Order()。 ()。 考虑到 IOrder 的实现有可能的变化, PetShop 仍然利用了工厂模式,将IOrder 对象的创建用专门的工厂模块进 行了封装: 在类 QueueAccess 中,通过 CreateOrder()方法利用反射技术创建正确的 IOrder 类型对象: public static CreateOrder() { string className = path + “.Order”。 return )(path).CreateInstance(className)。 } path 的值通过配置文件获取: private static readonly string path = [”OrderMessaging”]。 而配置文件中, OrderMessaging 的值设置如下: add key=”OrderMessaging” value=””/ 之所以利用工厂模式来负责对象的创建,是便于在业务层中对其调用,例如在 BLL 模块中 OrderAsynchronous 类: public class OrderAsynchronous : IOrderStrategy { private static readonly asynchOrder = ()。 public void Insert( order) { (order)。 } } 一旦 IOrder 接口的实现发生变化,这种实现方式就可以使得客户仅需要修改配置文件,而不需要修改代码,如此就可以避免程序集的重新编译和部署,使得系统能够灵活应对需求的改变。 例如定义一 个实现 IOrder 接口的SpecialOrder,则可以新增一个模块,如 ,而类名则仍然为 Order,那么此时我们仅需要修改配置文件中 OrderMessaging 的值即可: add key=”OrderMessaging” value=””/ OrderProcessor 是一个控制台应用程序,不过可以根据需求将其设计为Windows Service。 它的目的就是接收消息队列中的订 单数据,然后将其插入到Order 和 Inventory 数据库中。 它利用了多线程技术,以达到提高系统性能的目的。 在 OrderProcessor 应用程序中,主函数 Main 用于控制线程,而核心的执行任务则由方法 ProcessOrders()实现: private static void ProcessOrders() { // the transaction timeout should be long enough to handle all of orders in the batch TimeSpan tsTimeout = ((transactionTimeout * batchSize))。 Order order = new Order()。 while (true) { // queue timeout variables TimeSpan datetimeStarting = new TimeSpan()。 double elapsedTime = 0。 int processedItems = 0。 ArrayList queueOrders = new ArrayList()。 using (TransactionScope ts = new TransactionScope(, tsTimeout)) { // Receive the orders from the queue for (int j = 0。 j batchSize。 j++) { try { //only receive more queued orders if there is enough time if ((elapsedTime + queueTimeout + transactionTimeout) ) { d((queueTimeout))。 } else { j = batchSize。 // exit loop } //update elapsed time elapsedTime = new TimeSpan().TotalSeconds。 } catch (TimeoutException) { //exit loop because no more messages are waiting j = batchSize。 } } //process the queued orders for (int k = 0。 k。 k++) { ((OrderInfo)queueOrders[k])。 processedItems++。 totalOrdersProcessed++。 } //batch plete or MSMQ receive timed out ()。 } ((Thread Id + + ) batch finished, + processedItems + items, in + () + seconds.)。 } } 首先,它会通过 类的公共方法 ReceiveFromQueue()来获取消息队列中的订单数据,并将其放入到一个 ArrayList 对象中,然而再调用 类的 Insert 方法将其插入到 Order 和 Inventory 数据库中。 在 类中,并不是直接执行插入订单的操作,而是调用了 IOrderStrategy 接口的 Insert()方法: public void Insert(OrderInfo order) { // Call credit card procesor ProcessCreditCard(order)。 // Insert the order (a)synchrounously based on configuration (order)。 } 在这里,运用了一个策略模式,类图如下所示: 在 类中,仍然利用配置文件来动态创建IOrderStategy 对象: private static readonly orderInsertStrategy = LoadInsertStrategy()。 private static LoadInsertStrategy() { // Look up which strategy to use from config file string path = [”OrderStrategyA ssembly”]。 string className = [”OrderStrategyClass”]。 // Using the evidence given in the config file load the appropriate assembly and class return ()(path).CreateInstance(className)。 } 由于 OrderProcessor 是一个单独的应用程序,因此它使用的配置文件与PetShop 不同,是存放在应用程序的 文件中,在该文件中,对IOrderStategy 的配置为: add key=”OrderStrategyAssembly” value=”” / add key=”OrderStrategyClass” value=”” / 因此,以异步方式插入订单的流程如下图所示: Microsoft Messaging Queue(MSMQ)技术除用于异步处理以外,它主要还是一种分布式处理技术。 分布式处理中,一个重要的技术要素就是有关消息的处理,而在 命名空 间中,已经提供了 Message 类,可以用于承载消息的传递,前提上消息的发送方与接收方在数据定义上应有统一的接口规范。 MSMQ 在分布式处理的运用,在我参与的项目中已经有了实现。 在为一个汽车制造商开发一个大型系统时,分销商 Dealer 作为 .Net 客户端,需要将数据传递到管理中心,并且该数据将被 Oracle 的 EBS(EBusiness System)使用。 由于分销商管理系统( DMS)采用的是 C/S结构,数据库为 SQL Server,而汽车制造商管理中心的 EBS 数据库为 Oracle。 这里就涉及到两个系统 之间数据的传递。 实现架构如下: 首先 Dealer 的数据通过 MSMQ 传递到 MSMQ Server,此时可以将数据插入到 SQL Server 数据库中,同时利用 FTP 将数据传送到专门的文件服务器上。 然后利用 IBM 的 EAI 技。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。