Подключение к частной удаленной очереди MSMQ

Я пытаюсь подключиться к удаленной частной очереди 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. Вот мой конфиг

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

person Ian    schedule 17.12.2008    source источник
comment
Вы работаете в домене Active Directory или серверы являются автономными?   -  person Bernhard Hofmann    schedule 18.12.2008


Ответы (4)


Это очередь транзакций? Удаленное чтение из очереди транзакций невозможно. Возможно, структура Spring пытается проверить, является ли это очередью транзакций, и это также операция, которая поддерживается только в локальной очереди.

Рекомендуемая причина работы с очередями - запись в удаленную очередь и чтение из локальной очереди. В msmq 4.0 (Vista и Windows 2008) поддерживается удаленное транзакционное чтение (так я слышал).

Можете ли вы отладить код spring.net и увидеть точный код в случае сбоя процесса?

person Igal Serban    schedule 17.12.2008

Первое, что бросается в глаза, - это корпус вашего адреса конечной точки. По крайней мере, во всех других примерах, опубликованных в этой теме или здесь, используется другой регистр. . Во-вторых, вы не избегаете обратной косой черты внутри строки. Вместо

"FormatName:DIRECT=OS:remoteMachineName\Private$\MyQueue"

пытаться

"FormatName:Direct=OS:remoteMachineName\\private$\\MyQueue"

hth, Эрих

person Erich Eichinger    schedule 05.01.2009
comment
Экранирование обратной косой черты - это вещь кодирования C #. Это не относится к файлам конфигурации XML. Кроме того, ссылка на infosysblogs.com от Кена объясняет, что чувствительность к регистру применяется только к FormatName, а не Direct. - person spoulson; 28.01.2010

В документах справки Microsoft указано, что частные очереди «доступны» только с локального компьютера:

Общедоступные очереди реплицируются по всей сети очереди сообщений и потенциально могут быть доступны для всех сайтов, подключенных к сети.

Частные очереди не публикуются по всей сети. Вместо этого они доступны только на локальном компьютере, на котором они находятся. Доступ к частным очередям могут получить только приложения, которым известен полный путь или метка очереди.

(от: http://msdn.microsoft.com/en-us/library/19ww660c(VS.71).aspx).

На самом деле это все немного неоднозначно!

Еще одно сообщение о переполнении стека ссылается на эту статью:

http://technet.microsoft.com/ja-jp/library/cc753440(WS.10).aspx

В котором есть гораздо более полезное описание публичных и частных очередей.

person Liam    schedule 28.10.2010
comment
Начальная точка немного вводит в заблуждение. Частные очереди доступны удаленно, они просто не публикуются в Active Directory. Чтобы получить доступ к удаленной частной очереди, как вы говорите, вам необходимо знать полное имя пути или метку очереди. - person Ash Eldritch; 01.06.2011

Ваша попытка верна, но вы должны определить два других свойства для вашего объекта, указывающих, что ваша очередь удалена или нет, а также является транзакционной или нет:

<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>
person Masoud    schedule 01.05.2012