连接到专用远程MSMQ队列

时间:2008-12-17 22:05:53

标签: msmq spring.net

我正在尝试使用以下路径连接到远程私有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>

4 个答案:

答案 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>