.Net pet shop 4 和 MSMQ

最近没有事情的时候就研究.net pet shop 4,虽然已经发行很长时间了,可是当时没有时间看嘛。
看了架构,模式,profile机制,login的一套模板,觉得微软真为程序员着想,周到贴切。可是当我要运行.net pet shop 4的异步消息处理时候,却总是出错。经检查,原来是这么几点需要修改和注意:
1:就如pet shop 4的readme所言,修改web.config文件的<add key="OrderStrategyClass" value="PetShop.BLL.OrderSynchronous"/>为<add key="OrderStrategyClass" value="PetShop.BLL.OrderAsynchronous"/>
2:修改<add key="OrderQueuePath" value="FormatName:DIRECT=OS:MACHINNAME\\Private$\\PSOrders"/>为<add key="OrderQueuePath" value="FormatName:DIRECT=OS:.\Private$\PSOrders"/>,这里.代表本机,注意,你也可以使用机器名字。这个格式应该是AD(Active Directory)规定的吧。这样写效率也要高些。
3:修改orderprocessor文件夹下面的app.config文件,<add key="OrderQueuePath" value="FormatName:DIRECT=OS:MACHINENAME\\Private$\\PSOrders"/>改为<add key="OrderQueuePath" value="FormatName:DIRECT=OS:.\Private$\PSOrders"/>
4:在本机建立transactional queue,打开control panel->administrative tools->computer management->services and application->message queuing-> privary queues->在右边右键单击然后选择new->privary queue->填上PSOrders,并且一定不要忘记选中下面的transactional 的checkbox,因为.net pet shop 中的message使用了事务性message,待会做出说明。如果你看不到message queuing,那么可能你的消息服务没有开启,进入services.msc,然后开启消息服务,和DCOM服务。
现在你大概可以试验你的程序了,首先是登陆,提交,然后运行orderprocessor的控制台程序,然后你可以看到处理了item。
第二,三项我想是因为有的机器会把\\看成转义,但是有的不会(否则微软这样写不是闹了笑话?),所以慎重使用,如果使用原来的方式出错,则可以考虑这种。
第四个是一定要注意的,要选中下面的checkbox。
简单说一下MSMQ。
要实现异步信息处理,MSMQ是一个可以选择的方法之一,而且似乎是相当不错的选择,至于原因,这里不作阐述。
1:首先看看消息队列的路径问题:
.\DevXTestQueue References a public queue named DevXTestQueue on the local machine.
server01\DevXTestQueue References a public queue named DevXTestQueue on a machine named server01 (local queues can be referenced with a machine name as well).
.\private$\DevXTestQueue References a private queue named DevXTestQueue on the local machine.
server01\private$\DevXTestQueue References a private queue named DevXTestQueue on a machine named server01.
Direct Format Names
Formatname:DIRECT=OS:.\DevXTestQueue References a public queue named DevXTestQueue on the local machine.
Formatname:DIRECT=OS:server01\DevXTestQueue References a public queue named DevXTestQueue on a machine named server01.
Formatname:DIRECT=TCP:127.0.0.1\private$\DevXTestQueue References a private queue named DevXTestQueue on the local machine.
2:消息的格式有ActiveXMessageFormatter,BinaryMessageFormatter,XmlMessageFormatter。对于一般的文本消息,使用XmlmessageFormatter就行了,当然好用的资源和带宽也比较多,如果消息需要发送对象,那么使用binarymessageformatter就可以,速度很快,但是要进行对象的序列华和反序列化,activemessageformatter多用于发送组件对象。
3:消息也有一些很好的属性,如 CorrelationId可以保证客户端发送的消息到服务器被处理并且发挥response之后,客户端能准确知道哪条response对应哪条消息,就是使用correlationid决定的,因为客户端发送消息时候包含了该id,服务器端在处理的时候始终附带该id,最后发送response的时候仍然发送该id回去,这样客户端就可以辨认。客户端还可以建立reponseQueue这样,服务器的response就自然全部发送到客户端建立好的reponsequeue了,也非常方便。
4:事务性消息:消息之所以使用事务性的原因在于,第一是怕消息丢失,第二怕消息没有按照发送的顺序进行处理一致结果错误。
为了避免这些不足,所以使用了事务性消息,在具体使用的时候,可以选择single,atomatic,none,一般如果处理消息的时候可能碰到另外一个事务,比如数据库的事务,那么应该选择atomatic,对安全性要求不高可以使用none,如果在一次事务中仅仅对队列做一次操作,比如插message,删除message那么使用single可以,更详细的了解见msdn,这篇文章也不错:http://www.codeproject.com/dotnet/msmqpart2.asp
5:.net 20.0对消息提供了很多的很好的支持,用户只需要简单使用几个函数就可以了,不再象以前MFC一样的农清楚所有的消息循环,那个痛苦的时代一去不返了,要是用MSMQ,在.net 中加入system.message.dll 引用既可。


MSMQMessaging中的一些自己记录
MessageQueueTransactionType枚举这个有三个选项分别是Automatic(用于 Microsoft Transaction Server (MTS) 或 COM+ 1.0 服务的事务类型。如果已有 MTS 事务上下文,将在发送或接收消息时使用它。)、None(操作将不是事务性的。 )、Single(用于单个内部事务的事务类型。 )。MSMQMessaging的文件order中有注释中说到分布式事务。send方法用single主要是它只把数据发送到消息队列,而Receive用Automatic是他除了包括接收消息队列外还要兼故写入数据库的事务。
分布式事务:
    如果所有数据的修改仅依靠单个数据源就能完成,则这个事务就相当简单了。然而,随着商业需求的日益增加,应用程序变得越来越复杂,经常需要访问多个数据库,这些数据库通常分布在不同的地方,这就是分布式事务。分布式事务修改的数据存储在多个或多种类型的数据源中,这些数据源分布在多台机器上,甚至更复杂的情况。
    设想有一个事务,要求数据变化发生在两个分离的数据库中,仍然要求所有的ACID特性测试能够满足。基本的事务处理不能满足要求,因为如果其中一个数据库服务器失败,无法确保另外一个数据库的数据还没有提交并成为永久的。换句话说,无法协调发生在不同地方的多个事务处理就没有办法保证事务的原子性。
    例如,运行在机器A上的一个组件是单个事务的组成部分之一,组件能够利用机器B上的SQL Server执行数据库事务。组成事务的另一组件用运行在机器C上的Oracle服务器执行数据库事务。这三台机器运行着四块不同的代码,它们全都要参与到这个事务中。
    即使通过COM+隐藏分布式事务中的细节,也必要研究和了解分布式事务的“幕后”结构。请记住这些ACID特性适用于所有类型的事务,不论事务涉及的数据库是什么类型或数量有多少。



你可能感兴趣的:(.net)