2017-01-16 9 views
1

Мне нужна подтвержденная доставка в удаленную очередь, а в соответствии с MSDN Exists() метод не поддерживает удаленную проверку очереди.MSMQ синхронная запись в удаленную очередь

По мне доставки сообщений может потерпеть неудачу в следующих двух сценариях

  • удаленный компьютер не доступен.
  • Очередь на машине не существует или была удалена.

Я использую транзакционную очередь. Установка AdministrationQueue и UseDeadLetterQueue гарантирует, что сообщения не будут потеряны.

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

ответ

0

Поддерживает ли MSMQ это и как это возможно, даже если это не , поддерживаемый дизайном?

Служба MSMQ не имеет встроенного способа поддержки двусторонней передачи сообщений.

Для этого вам потребуется код на обоих концах очереди. Однако в лучшем случае это, как правило, сложно.

Следующая ссылка описывает, как добиться этого с помощью System.Messaging:

https://www.codeproject.com/Articles/999238/Efficient-Message-Correlation-in-MSMQ

Он основан на использовании CorrelationId заголовка с операцией ReceiveByCorrelationId(), который как известно, плохо для производительности.

Другой способ сделать это с помощью WCF, однако, это все еще полагается на ручной ответ, используя System.Messaging:

https://msdn.microsoft.com/en-us/library/ms751435(v=vs.110).aspx

Еще один подход использует WCF и вспомогательная библиотека под названием Duplex MSMQ:

https://www.codeproject.com/Articles/41907/WCF-Duplex-MSMQ

Однако ни один из этих методов не очень хорошо, и все нежелательные сложности ввести.

мне нужно подтвержденное доставку в удаленной очереди

Я думаю, что мы должны понять, что вы подразумеваете под «подтвердил». Если вы используете транзакционную очередь, это обеспечивает гарантированную семантику доставки при передаче сообщений из одного приложения в другое.

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

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

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

Если я понимаю правильно, то ваше требование является подтверждением, что MSMQ делает поддержку. См:

https://msdn.microsoft.com/en-us/library/ms978430.aspx#bdadotnetasync2_topic4

https://msdn.microsoft.com/en-us/library/ms707129(v=vs.85).aspx

+0

Это отличный ответ. Да, вы правы. Я использую tranactional queues для «Подтвержденной доставки». То, что мне было нужно, это реакция в реальном времени на успех и сообщения об ошибках, так что я могу прекратить отправлять больше сообщений в очередь. Первая статья кодекса, о которой вы упомянули, не подходит в моем сценарии. Потребителем сообщения является служба Windows, которая считывает из целевой очереди. Если мы дождаемся сообщения с CorrelationID в этой очереди, мы можем войти в состояние гонки, когда сообщение будет поднято первым, и мы все равно дождитесь сообщения. – Xlr8

+0

@ Xlr8 - зачем вам нужен транспорт в очереди? Кроме того, вы говорите о запросе-ответе, или вам просто нужно подтверждение? –

+0

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