msmq两个网域之间消息传输与接收测试总结
近一段时间我负责的一个项目,在做数据传递时,选择了msmq的作为传输平台,由于网络环境和应用系统平台的复杂性,针对msmq的解决方案,我做了大量的测试,也遇到了很多的问题,其中有面对不同windows操作系统时的,也有面对不同的网络环境的(网通、电信、铁通等等),也有和传输报文的内容及大小相关的,也有和msmq server的安全和权限设定相关的,由于ms的mq是免费产品,所以能得到的技术支持有限,不得不自己边摸索边总结,其中的苦闷可想而知。为了让以后使用msmq的朋友少走些弯路,我把自己的一些碰到的一些问题和解决方法公布出来,供大家参考,由于时间有限,该文在后面慢慢完善。
问题描述:
1,应用场景:在2台域控制器window2003 Server A和B之间用msmq3.0做消息传递.2台server都打了最新的补丁包,
msmq安全属性给everyone群组最高权限,域控制安全策略网络访问设定让everynone权限应用于匿名用户。
A做MSMQ Server的服务器,A服务器上建有公共队列A001;
B做msmq的客户端,部署有发送和接收应用程序。
2,应用过程
B发送应用程序向A上的消息队列A001发送消息,在A的消息队列A001中看到从B发送来的消息,表明消息发送成功;
B接收应用程远程读取A上消息队列A001中的消息,出现异常。
3,应用程序代码
//消息发送
try
{
System.Messaging.MessageQueue Queue;
Queue = new System.Messaging.MessageQueue(@"FormatName:DIRECT=TCP:172.26.230.2\ptest1");
System.Messaging.Message Msg;
Msg = new System.Messaging.Message();
Msg.Formatter =new System.Messaging.BinaryMessageFormatter();
Msg.Body="Testing 3 times";
Queue.Send(Msg);
}
catch(Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.ToString());
}
//消息接收
try
{
System.Messaging.MessageQueue mq = new System.Messaging.MessageQueue(@"FormatName:DIRECT=tcp:172.26.230.2\ptest1");
// Set the queue'ss formatter to decode Point objects
mq.Formatter = new System.Messaging.BinaryMessageFormatter();
System.Messaging.Trustee trustee=new System.Messaging.Trustee();
System.Messaging.Message msg = mq.Peek ( new TimeSpan(10000)) ;
// Convert received message to object that we think was sent
string pt = (string) msg.Body ;
// Display it to the user
MessageBox.Show (pt) ;
}
catch(Exception ex)
{
MessageBox.Show(ex.ToString());
}
4,接收消息的异常
/*
---------------------------
System.Messaging.MessageQueueException
at System.Messaging.MQCacheableInfo.get_ReadHandle()
at System.Messaging.MessageQueue.StaleSafeReceiveMessage(UInt32 timeout, Int32 action, MQPROPS properties, NativeOverlapped* overlapped, ReceiveCallback receiveCallback, IntPtr cursorHandle, IntPtr transaction)
at System.Messaging.MessageQueue.ReceiveCurrent(TimeSpan timeout, Int32 action, IntPtr cursor, MessagePropertyFilter filter, MessageQueueTransaction internalTransaction, MessageQueueTransactionType transactionType)
at System.Messaging.MessageQueue.Peek(TimeSpan timeout)
at InternetQueueingRecipient.Form1.button2_Click(Object sender, EventArgs e) in c:\msmqandnet\msmqandnet\internetqueuing\internetqueueingrecipient\form1.cs:line 294
*/
我在做测试的过程中,如果B为独立服务器(没有装AD),其操作系统为window2003,window xp,window2000接收消息都没有问题,但是在域
控制器作为客户端接收消息的服务器时就出现了如上问题,原因是什么?如何解决这个问题?在域控制器中msmq默认的远程读取帐户是什么?
6,总结
1. MQ不能用HTTP方式接收(只能用HTTP方式发送)
2. 在不同网域接收MQ时,必须打开everynone和guest账号(可以试试)。
3. 建议不要用client去接收MQ讯息,这样会存在很多安全隐患,而且讯息接收不稳定。
MQ SERVER 有可能会“瀑满”,也就是说,如果讯息来不及“取走”的话,会丢失。
7,向微软确认后,微软的回复
Here are eleven programming guidelines for Writing Better MSMQ Applications You should follow them when writing an MSMQ application.
- Do only local receives.
- Avoid functions that query the Message Queue Information Store (MQIS).
- Implement timeouts.
- Understand the limits of asynchronous notification.
- Know when and where to use transactions.
- Know when to use persistable COM objects.
- Understand what security context to use.
- Implement smart queue usage.
- Request acknowledgements or nonacknowledgements.
- Remember case sensitivity.
- Test your application with a full reboot while offline.
posted on 2005-12-29 13:39 billqi(岁月如水) 阅读(3725) 评论(10) 编辑 收藏 举报