Как перехватить ответное сообщение входящего шлюза jms

У меня есть jms-inbound-gateway, который читает запросы от брокера WebsphereMQ, передает их через мою систему интеграции и затем отвечает ответным сообщением.

Мне нужно регистрировать сообщения с установленными заголовками jms_messageId и jms_correlationId, чтобы я мог сопоставлять сообщения запроса/ответа в файле журнала (и показывать его моему клиенту, когда он говорит, что мой ответ не имеет правильного jms_correlationId)

Есть ли способ перехватить метод производителя.sendReply(...) после того, как заголовок корреляции Id установлен?


person Martins    schedule 26.02.2015    source источник


Ответы (2)


Там нет необходимости перехватывать; заголовки доступны в сообщении Spring Integration в ответном сообщении шлюза до того, как оно попадет на шлюз.

Просто сделайте reply-channel publish-subscribe-channel и добавьте <logging-channel-adapter/>, который имеет его в качестве входного канала.

Ответное сообщение будет отправлено как шлюзу, так и регистратору.

Если вы используете механизм по умолчанию для маршрутизации ответа (без output-channel в вашем последнем компоненте интеграции), просто добавьте output-channel и маршрутизируйте к ответному каналу.

person Gary Russell    schedule 26.02.2015
comment
Ты гений! Работал как шарм (мне потребовалось некоторое время, потому что я не знал об атрибуте reply-channel). Спасибо, Гэри. - person Martins; 26.02.2015

В этом суть моего решения после ввода Гэри:

<jms:inbound-gateway 
    id="inboundDestination" 
    connection-factory="connectionFactory"  
    request-destination="nmRequestsQueue" 
    request-channel="request-begin" 
    reply-channel="request-end" 
    error-channel="normaErrorChannel" 
    concurrent-consumers="1" 
    acknowledge="transacted" />

<int:logging-channel-adapter id="request-response-logger"
        log-full-message="true"
        level="DEBUG" 
        logger-name="com.audaxys.si.messages" />

<int:channel id="request-begin">
    <int:interceptors>
        <int:wire-tap channel="request-response-logger" />
    </int:interceptors>
</int:channel>

<int:chain input-channel="request-begin" output-channel="request-end">
    ... Do Stuff ...
</int:chain>

<int:publish-subscribe-channel id="request-end">
    <int:interceptors>
        <int:wire-tap channel="request-response-logger" />
    </int:interceptors>
</int:publish-subscribe-channel>
person Martins    schedule 26.02.2015
comment
Для записи; поскольку вы используете перехватчик для регистрации, request-end не обязательно должен быть pub-sub; это должно быть pub-sub, если регистратор имеет request-end в качестве входного канала. - person Gary Russell; 26.02.2015