Я немного растерялся в использовании тем в WebSphere MQ 7. Предположим, что простой сценарий:
- У меня есть процесс публикации сообщений в теме.
- У меня ноль или более подписчиков, получающих сообщение.
- Любой подписчик может решить отреагировать на полученное сообщение = необязательный «ответ». (Примечание: Первоначально было принято решение использовать темы для ответов, но я при необходимости заменим их на очередь). В опубликованном сообщении может быть настроено
ReplyToQueueName
или настройка на уровне системы на клиенте.
- Ответ должен быть соотнесен с исходным опубликованным «запросом» (поскольку может быть более одного опубликованного запроса).
Теперь, как это сделать? Я пытался использовать общий подход из очередей MQ, где инициатор выбирал либо:
- Установить для отчета значение
MQRO_COPY_MSG_ID_TO_CORREL_ID
. Получатель примет идентификатор сообщения из запроса и передаст его в качестве идентификатора корреляции в ответ.
- Установить для отчета значение
MQRO_PASS_CORREL_ID
+ установить идентификатор корреляции в сообщении запроса. Получатель возьмет идентификатор корреляции из запроса и установит его как идентификатор корреляции в ответном сообщении.
В обоих случаях отправителю известно об идентификаторе сообщения или идентификаторе корреляции, переданных в запрос, чтобы он мог правильно сопоставлять сообщения, но это не работает с темами MQ.
Если я пытаюсь следовать упомянутым подходам, у меня сразу возникает проблема при публикации запроса - идентификатор сообщения не установлен на стороне издателя (он пустой), поэтому первый подход невозможен. Если я попытаюсь установить идентификатор корреляции на стороне издателя, я получу другой на стороне подписчика, поэтому я не могу использовать его для корреляции сообщений (= второй подход также невозможен).
Вот несколько примеров того, что происходит при использовании тем (идентификаторы в Base64):
Тест с использованием MQRO_COPY_MSG_ID_TO_CORREL_ID
:
Send request: // After sending message publisher doesn't know its ID!
Message Id: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Correlation Id: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Received request: // Subscriber gets some ID and correlation ID (but publisher didn't set any)
Message Id: QU1RIExNLnF1ZXVlLm1hbp2OiU4g6AYH
Correlation Id: QU1RIExNLnF1ZXVlLm1hbp2OiU4g6AYF
Send response: // Subscriber correctly uses message ID of incoming request
Message Id: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Correlation Id: QU1RIExNLnF1ZXVlLm1hbp2OiU4g6AYH
Received response: // Publisher gets in response completely different IDs!
Message Id: QU1RIExNLnF1ZXVlLm1hbp2OiU4g6AYP
Correlation Id: QU1RIExNLnF1ZXVlLm1hbp2OiU4g6AYN
Тест с использованием MQRO_PASS_CORREL_ID
:
Send request: // Publisher doesn't know its ID but it generated some random correlation ID.
Message Id: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Correlation Id: Chhv8KT+zhTjfAEdzeiB3cizw9vRy9Pf
Received request: // Subscriber got ANOTHER correlation ID!
Message Id: QU1RIExNLnF1ZXVlLm1hbp2OiU4g6AYY
Correlation Id: QU1RIExNLnF1ZXVlLm1hbp2OiU4g6AYW
Send response: // Subscriber is using incorrect correlation ID.
Message Id: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Correlation Id: QU1RIExNLnF1ZXVlLm1hbp2OiU4g6AYW
Received response: // Publisher gets in response completely different IDs!
Message Id: QU1RIExNLnF1ZXVlLm1hbp2OiU4g6AYg
Correlation Id: QU1RIExNLnF1ZXVlLm1hbp2OiU4g6AYe
Как заставить MQ не изменять мои идентификаторы? Я написал тестовые приложения на Java и .NET, и оба ведут себя одинаково. Или каков правильный подход для моего варианта использования?