我正在尝试使用以下路径连接到远程私有MSMQ队列:
"FormatName:DIRECT=OS:remoteMachineName\Private$\MyQueue"
我收到以下错误:
"The specified format name does not support the requested operation. For example, a direct queue format name cannot be deleted."
我显然做错了什么。但是,这确实可以使用本地队列。
我正在使用Spring.Net的Messaging。这是我的配置
<objects xmlns="http://www.springframework.net">
<object id="myQueue" type="Spring.Messaging.Support.MessageQueueFactoryObject, Spring.Messaging">
<property name="Path" value="FormatName:DIRECT=OS:remoteMachineName\Private$\MyQueue"/>
</object>
<object id="messageQueueTemplate" type="Spring.Messaging.Core.MessageQueueTemplate, Spring.Messaging">
<property name="DefaultMessageQueueObjectName" value="myQueue"/>
</object>
<object id="messageGateway" type="My.MessageGateway, My.Assembly">
<property name="MessageQueueTemplate" ref="messageQueueTemplate"/>
</object>
</objects>
答案 0 :(得分:5)
这是一个交易队列吗?无法从事务性队列中远程读取。也许spring框架尝试检查这是否是一个事务性队列,这也是一个仅在本地队列上受支持的操作。
建议使用队列的原因是写入远程队列并从本地队列中读取。在msmq 4.0(vista和windows 2008)中支持远程事务读取(所以我听说过)。
你可以对spring.net代码进行debbug并在进程失败时查看确切的代码吗?
答案 1 :(得分:-1)
首先引人注目的是端点地址的外壳。至少在此主题中发布的所有其他示例或here使用不同的大小写。其次,你没有逃避字符串中的反斜杠。而不是
"FormatName:DIRECT=OS:remoteMachineName\Private$\MyQueue"
试
"FormatName:Direct=OS:remoteMachineName\\private$\\MyQueue"
HTH, 埃里希
答案 2 :(得分:-1)
Microsoft帮助文档声明私有队列只能从本地计算机“可用”:
公共队列在整个消息队列网络中进行复制,并且可能被网络连接的所有站点访问。
私有队列不会在整个网络中发布。相反,它们仅在包含它们的本地计算机上 可用 。只有知道队列的完整路径名或标签的应用程序才能访问专用队列。
(来自:http://msdn.microsoft.com/en-us/library/19ww660c(VS.71).aspx)。
这真的有点模棱两可!
Stack Overflow上的另一篇文章引用了这篇文章:
http://technet.microsoft.com/ja-jp/library/cc753440(WS.10).aspx
对公共队列和私人队列有更有用的描述。
答案 3 :(得分:-1)
您的尝试是正确的,但您必须为您的对象定义另外两个属性,表明您的队列是远程的,是否是事务性的:
<object id="myQueue"
type="Spring.Messaging.Support.MessageQueueFactoryObject,Spring.Messaging">
<property name="Path" value="FormatName:DIRECT=OS:remoteMachineName\Private$\MyQueue"/>
<property name="RemoteQueue" value="true"/>
<property name="RemoteQueueIsTransactional" value="true"/>
</object>