Подтвердить что ты не робот

Запись на удаленную MSMQ

Хорошо, вот очень простой и фундаментальный вопрос. Если у меня есть приложение на компьютере Windows A, которое хочет записать в очередь на машине Windows B, мне нужно установить MSMQ на машине A (хотя там нет очереди)? Я только начинаю использовать очереди для своих приложений и пытаюсь понять некоторые основы.

Спасибо

4b9b3361

Ответ 1

Да, вам нужно, чтобы MSMQ устанавливался локально для записи в удаленную очередь. Если вы пишете в приватную очередь, посмотрите эту страницу, в которой есть полезная информация о том, как форматировать имя очереди. Если вы пишете в удаленную очередь транзакций, то вам нужно убедиться, что вы правильно это указали (пункт 5)

Это текст статьи:

1. При работе с удаленными очередями имя очереди в формате machinename\private$\queuename не работает. Это приводит к Ошибка недопустимого пути в очереди.

2. Имя очереди должно быть указано как FormatName:Direct=OS:machinename\\private$\\queuename.

Это необходимо, так как доступ к очереди осуществляется внутренне с использованием формата имя синтаксис только. Другое дружеское представление преобразуется в formatName, а затем используется. При работе с удаленными очередями, кроме есть AD для разрешения имени очереди, дружественное имя не будет Работа. Подробнее см. Документацию.

Например,

MessageQueue rmQ = new MessageQueue 
              ("FormatName:Direct=OS:machinename\\private$\\queue");
rmQ.Send("sent to regular queue - Atul");

3. В дополнение к предыдущему пункту обратите внимание, что FormatName чувствителен к регистру. Если вы упомянете предыдущую строку как FormatName:Direct=OS:machinename\\private$\\queuename, это не будет Работа. Удивительно, но в этом случае нет ошибки. "FormatName" часть строки кажется единственным чувствительным к регистру часть. Другие могут появляться в разных случаях. Напр. Ты можешь написать "НЕПОСРЕДСТВЕННЫЙ".

4. Если вы хотите использовать IP-адрес устройства, синтаксис будет FormatName:Direct=TCP:ipaddress\\private$\\queuename.

Например,

MessageQueue rmQ = new MessageQueue
              ("FormatName:Direct=TCP:121.0.0.1\\private$\\queue");
rmQ.Send("sent to regular queue - Atul");

5. Транзакционные свойства экземпляра очереди, который вы создаете в коде, должны совпадать с транзакционными свойствами очереди, которую вы пытаетесь отправить сообщение. Поэтому в предыдущих примерах я отправлял сообщение не транзакционная очередь. Чтобы отправить транзакционную очередь, код будет

MessageQueue rmTxnQ = new MessageQueue
            ("FormatName:Direct=OS:machinename\\private$\\queue");
rmTxnQ.Send("sent to Txn queue - Atul", MessageQueueTransactionType.Single);

Если свойства транзакции не совпадают, сообщение не будет доставлен. Удивительная часть снова, я не получил никакой ошибки, и сообщение просто исчезло

6. Наконец, при отправке сообщений в удаленную очередь временная исходящая очередь создается на вашей собственной машине. Это используется в случае удаленная очередь недоступна. Если вы перейдете на компьютер Управление console (compmgmt.msc) и развернуть Службы и приложения/ Очереди сообщений/исходящих очередей, вы увидите эти очереди. правая сторона консоли должна показывать детали, включая состояние (подключен или нет) и IP-адрес для следующего скачка (ов).

Ответ 2

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

Ответ 3

Другой (вместо установки MSMQ на локальном компьютере, на котором запущен клиент) будет реализовывать службу WCF, которая берет свои сообщения из очереди MSMQ. В этом случае ваш удаленный клиент должен будет указать конечную точку удаленного сервиса, чтобы он мог напрямую записываться в удаленную очередь. Вы также должны быть осторожны, чтобы безопасность в удаленной очереди была установлена ​​правильно.

Я думаю, что это был бы лучший способ реализации связи на основе очереди. Это короткий ответ, но я буду счастливо расширяться, если вам интересно (я заметил, что вы были довольны другим ответом:)

Ответ 4

ниже формат работал для нас

key="PublicQueueName" value="FormatName:Direct=TCP:192.168.12.58\private$\myqueue"

Также вам потребуется предоставить разрешения удаленного доступа к очереди

безопасность: разрешить вход в систему Anonymus

введите описание изображения здесь