Поддерживает ли 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
Это отличный ответ. Да, вы правы. Я использую tranactional queues для «Подтвержденной доставки». То, что мне было нужно, это реакция в реальном времени на успех и сообщения об ошибках, так что я могу прекратить отправлять больше сообщений в очередь. Первая статья кодекса, о которой вы упомянули, не подходит в моем сценарии. Потребителем сообщения является служба Windows, которая считывает из целевой очереди. Если мы дождаемся сообщения с CorrelationID в этой очереди, мы можем войти в состояние гонки, когда сообщение будет поднято первым, и мы все равно дождитесь сообщения. – Xlr8
@ Xlr8 - зачем вам нужен транспорт в очереди? Кроме того, вы говорите о запросе-ответе, или вам просто нужно подтверждение? –
Мне нужен запрос-ответ. Я должен подождать, пока сообщение не будет получено или отклонено. Я знаю, что MSMQ предназначен для отключенных систем, но в моем случае давайте предположим, что системы находятся в режиме онлайн. – Xlr8