Я понимаю, что приду к этой дискуссии немного поздно, и вы, вероятно, уже написали это приложение. Если вам когда-нибудь понадобится изменить его или кому-либо еще, кому может понадобиться сделать что-то подобное, у меня есть пара замечаний.
Во-первых, если вы можете сделать это с клиентом v7 QMgr и v7 WMQ, это будет предпочтительным решением. В версии 7 поддержка .Net была перемещена из SupportPac в часть базового продукта. Появилась новая функциональность, исправлены некоторые ошибки и улучшена производительность. Кроме того, на v7 вы можете использовать pub-sub ... что подводит меня ко второму наблюдению.
Исходя из описания в исходном посте, я бы сделал это в Pub-Sub. Приложение, которое помещает сообщение, должно поместить только одно, и ему даже не нужно знать, что оно помещает в тему. Вы можете создать псевдоним для темы, которая будет выглядеть как очередь для производителя сообщений. Приложения-потребители могут либо подписаться, либо вы можете создать две административные подписки, чтобы опубликованные сообщения попадали в две назначенные вами очереди. Каждое из ваших приложений имеет выделенную очередь, и для производителя и пакетного приложения не требуется никаких изменений в кодировании, это просто конфигурация. Конечно, приложение, управляющее транзакциями, должно будет на самом деле потреблять сообщения, а не просматривать их.
Преимуществ здесь несколько:
- Когда очередь заполняется сообщениями, индексирование сбрасывается на диск, и выше порогового значения вы увидите снижение производительности, которое может быть значительным. Поэтому текущий метод не так хорошо масштабируется.
- С помощью метода pub-sub вы можете иметь несколько экземпляров приложений реального времени, пакетных приложений или обоих, и они могут быть в одном или другом QMgr. Масштабировать легко.
- Вы устраняете зависимость между приложениями реального времени и пакетными приложениями, которые должны быть в одном QMgr.
- Более прозрачное управление. Если вы видите сообщения, накапливающиеся в очереди в реальном времени, вы знаете, что у вас есть проблема.
Пара совершенно разных вопросов. Одним из них является использование опции Fail if Quiescing. Цель этого состоит в том, что, когда QMgr выключается полностью, эта опция заставляет ваш вызов API завершаться с кодом возврата, указывающим, что QMgr закрывается. Если вы не включите эту опцию, то с двумя или более подключенными приложениями возможно, что QMgr будет никогда не выключаться чисто, и его нужно будет принудительно выключить или убить его процессы с помощью грубой силы. Как правило, всегда используйте Fail, если Quiescing на всех вызовах API, которые его поддерживают. Причина, по которой он вообще существует, для людей, которым нужна транзакционность XA, но по какой-то причине они не могут ее использовать. В этом сценарии CONNECT и первый вызов GET или PUT используют Fail, если нет установленного Quiescing, а последующие операции GET или PUT - нет. Это заставляет QMgr ожидать завершения всего набора вызовов GET / PUT, но затем следующий CONNECT или GET / PUT использует Fail, если Quiescing, так что QMgr имеет возможность завершить работу при необходимости.
Другое замечание здесь заключается в том, что здесь нет кода Catch. Я предполагаю, что есть еще одна область действия вверх по стеку вызовов? Всегда желательно напечатать код возврата WMQ из исключения, чтобы вы могли найти основную причину. В консультациях я всегда советую клиентам, что невозможность напечатать код возврата (или связанное исключение для кода JMS / XMS) является демонстрацией, которая должна препятствовать продвижению приложения в Production. Это действительно так важно. Даже если у вас есть перехват в коде, который вызывает getMessage (), кто-то, повторно использующий здесь фрагмент кода примера, может не осознавать, что этот важный фрагмент отсутствует.