2015-03-27 4 views
2

Я пытаюсь реализовать получить выход в Java, как предложено здесь: http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_7.0.1/com.ibm.mq.csqzaw.doc/jm11171_.htmClient Получить Выход с IBM WebSphere MQ JMS

// This method implements the receive exit interface 
    public ByteBuffer channelReceiveExit(MQCXP channelExitParms, 
            MQCD channelDefinition, 
            ByteBuffer agentBuffer) 
{ 
    // Complete the body of the receive exit here 
} 

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

Любая подсказка будет оценена по достоинству.

UPD Я был не прав о agentBuffer всегда null, это не так. После ответа T.Rob мне удалось поймать несколько вызовов с помощью MQCXP.ExitReason = 14 (MQXR_XMIT). С одним из этих вызовов я получаю данные сообщений в буфере, и представляется возможным изменить такие данные. Но все же существует проблема с другими вызовами, имеющая тот же ExitReason, но не соответствующий какой-либо реальной передаче сообщений. Мне нужно пропустить такие звонки, но пока не знаю, как их отличить.

Любая идея, как я могу это сделать?

ответ

4

Существует несколько видов выхода канала в MQ. Каналы MCA (QMgr-to-QMgr) делают точку выхода доступной, когда все сообщение находится в буфере. Эта точка выхода вызывает выход сообщения. Все каналы, MCA и MQI (клиент), имеют доступ к точкам отправки/получения. Точки выхода отправки/получения выполняются в любое время, когда вызывается передача от одного агента канала к другому.

В случае клиентских каналов выход приема может быть вызван для потоков, которые не включают передачу сообщений, или они могут быть вызваны много раз для одного сообщения. Это зависит от программы, чтобы проверить MQCXP structure, чтобы определить вызов API, который протекает по каналу клиента, и должен ли буфер агента содержать или не содержать что-либо в этот момент времени.

Обратите внимание, что выходы отправки и получения обычно работают парами. Поскольку диспетчер очередей не вызывает программы Java из MCA, любой соответствующий ответ «Отправить или получить» на стороне менеджера очереди будет записан на C.

Для получения дополнительной информации см. Страницу руководства по адресу Channel send and receive exit programs.

2

Кодирование выхода в MQ чрезвычайно сложно и требует глубокого знания MQ. Пара каналов канала SVRCONN/CLNTCONN имеет двунаправленный поток трафика на нем, и вы НЕ видите все сообщение (если оно не меньше 32758 байт). То, что вы видите в канале отправки/получения выхода, - это сообщения заголовка передачи (TSH). Примечание: сообщения TSH НЕ документированы IBM !!!

MCA (агент канала сообщений) вызывает выход отправки/получения канала для различных «ExitReason», определенных MQXR _ ***.

Но agentBuffer кажется нулевым каждый раз, так что я не вижу способа, чтобы влиял на данные сообщения.

Это потому, что вы не понимаете MQ и поток двунаправленного канала. Вы понимаете, что сообщения TSH находятся в двоичном виде, а не в обычном тексте!?! Правильно? Вы сбрасываете/печатаете буфер в HEX или делаете System.out.println ?? Если последние видят мое первое предложение в этом посте.

Используйте отладчик и просмотрите данные TSH. Пожалуйста, не спрашивайте, почему вы смотрите на странные вещи, как я сказал, сообщения TSH НЕ документированы IBM!Если вы хотите получить информацию, переходите к коду для Wire Shark, так как они имеют обратную конструкцию сообщений TSH.

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

Смежные вопросы