from:
http://ysqraymond.spaces.live.com/blog/cns!83736954153d06d9!222.entry
最近没有事情的时候就研究.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 引用既可。
以上对MSMQ做了一点记录。