3
votes

I'm using a header-enricher in spring integration to add some info to message header.

<int:header-enricher input-channel="inboundReqOutboundChannel"
        output-channel="validRequestChannel">
        <int:header name="original-payload" ref="messageCreator"
            method="reqHeaderEnricher"></int:header>
</int:header-enricher>

After the header is enriched, the request message is passed on as below.

header-enricher --> channel --> jmsOutboundgateway

Then the response message flow is as below.

    jms-message-driven-adapter --> service-activator --> channel --> 
header-filter --> channel --> from here to jmsOutboundgateway's reply destination

The header-filter in response message flow is as below

<int:header-filter input-channel="headerFilterChannel"
        header-names="original-payload" output-channel="responseOutChannel" />

But the response message is still having the original-payload header even after passing the header-filter.

Any additional configuration need to be done for header-filter to work properly?

Please point me the correct approach.

Many thanks for suggestions!

Debug Logs:

After the message passes the header filter in responseFlow:

header-filter --> intermediateRespOutChannel --> jmsOutboundAdapter --> to jmsOutBoundGateway

The original-payload header is removed when the message passes the intermediateRespOutChannel after the header-filter.

2015-07-25 17:07:14,306 DEBUG [org.springframework.integration.channel.DirectChannel] preSend on channel 'headerFilterChannel', message: GenericMessage [payload=javax.xml.bind.JAXBElement@e7e6f9, headers={transaction_id=WSG91075596120150725170705797, sequenceNumber=1, sequenceSize=1, WsGwCorrelationID=5c57f681-9b08-4c6f-8bdb-c400dd5299a2, priority=4, jms_timestamp=1437824232246, uri=http://localhost:8082/OnlineSOAPBinding/soapui/OnlineReqSOAPBinding, ffp=AB, sendingsys=AB, jms_redelivered=false, OutboundRetroCorrelationKey=520a0ea3-465c-4b92-aa4c-ed32703aae5e, jms_replyTo=queue://PAI_RES_INTER_OUTQ, ws_soapAction=processRequest, original-payload=SomeValueFromRequest, id=d8af82e0-3555-0df9-7c8a-ce082c2e7ec7, jms_messageId=ID:01HW370406-53356-1437823659837-1:2948:1:1:1, receivingsys=SZ, timestamp=1437824233993}]
2015-07-25 17:07:14,306 DEBUG [org.springframework.integration.transformer.MessageTransformingHandler] org.springframework.integration.transformer.MessageTransformingHandler#2 received message: GenericMessage [payload=javax.xml.bind.JAXBElement@e7e6f9, headers={transaction_id=WSG91075596120150725170705797, sequenceNumber=1, sequenceSize=1, WsGwCorrelationID=5c57f681-9b08-4c6f-8bdb-c400dd5299a2, priority=4, jms_timestamp=1437824232246, uri=http://localhost:8082/OnlineSOAPBinding/soapui/OnlineReqSOAPBinding, ffp=AB, sendingsys=AB, jms_redelivered=false, OutboundRetroCorrelationKey=520a0ea3-465c-4b92-aa4c-ed32703aae5e, jms_replyTo=queue://PAI_RES_INTER_OUTQ, ws_soapAction=processRequest, original-payload=SomeValueFromRequest, id=d8af82e0-3555-0df9-7c8a-ce082c2e7ec7, jms_messageId=ID:01HW370406-53356-1437823659837-1:2948:1:1:1, receivingsys=SZ, timestamp=1437824233993}]
2015-07-25 17:07:14,306 DEBUG [org.springframework.integration.channel.DirectChannel] preSend on channel 'intermeddiateResponseOut', message: GenericMessage [payload=javax.xml.bind.JAXBElement@e7e6f9, headers={transaction_id=WSG91075596120150725170705797, sequenceNumber=1, sequenceSize=1, WsGwCorrelationID=5c57f681-9b08-4c6f-8bdb-c400dd5299a2, priority=4, jms_timestamp=1437824232246, uri=http://localhost:8082/OnlineSOAPBinding/soapui/OnlineReqSOAPBinding, ffp=AB, sendingsys=AB, jms_redelivered=false, OutboundRetroCorrelationKey=520a0ea3-465c-4b92-aa4c-ed32703aae5e, jms_replyTo=queue://PAI_RES_INTER_OUTQ, ws_soapAction=processRequest, id=af627505-55ca-854e-d2e8-1687fa5aca34, jms_messageId=ID:01HW370406-53356-1437823659837-1:2948:1:1:1, receivingsys=SZ, timestamp=1437824234306}]
2015-07-25 17:07:14,306 DEBUG [org.springframework.integration.jms.JmsSendingMessageHandler] org.springframework.integration.jms.JmsSendingMessageHandler#1 received message: GenericMessage [payload=javax.xml.bind.JAXBElement@e7e6f9, headers={transaction_id=WSG91075596120150725170705797, sequenceNumber=1, sequenceSize=1, WsGwCorrelationID=5c57f681-9b08-4c6f-8bdb-c400dd5299a2, priority=4, jms_timestamp=1437824232246, uri=http://localhost:8082/OnlineSOAPBinding/soapui/OnlineReqSOAPBinding, ffp=AB, sendingsys=AB, jms_redelivered=false, OutboundRetroCorrelationKey=520a0ea3-465c-4b92-aa4c-ed32703aae5e, jms_replyTo=queue://PAI_RES_INTER_OUTQ, ws_soapAction=processRequest, id=af627505-55ca-854e-d2e8-1687fa5aca34, jms_messageId=ID:01HW370406-53356-1437823659837-1:2948:1:1:1, receivingsys=SZ, timestamp=1437824234306}]
2015-07-25 17:07:14,309 DEBUG [org.springframework.integration.jms.DynamicJmsTemplate] Executing callback on JMS Session: ActiveMQSession {id=ID:01HW370406-59320-1437824218347-1:5:1,started=true}

In downstream flow after jmsOutboundgateway, the debug log is as below

jmsOutboundGateway --> outboundResAggregatorChannel --> Aggregator --> channel-->

In the outboundResAggregatorChannel, the original-payload header is again added

2015-07-25 17:07:14,561 DEBUG [org.springframework.integration.channel.DirectChannel] preSend on channel 'outboundResAggregatorChannel', message: GenericMessage [payload=javax.xml.bind.JAXBElement@9f7158, headers={transaction_id=WSG91075596120150725170705797, sequenceNumber=1, sequenceSize=1, WsGwCorrelationID=5c57f681-9b08-4c6f-8bdb-c400dd5299a2, priority=4, jms_timestamp=1437824234313, uri=http://localhost:8082/OnlineSOAPBinding/soapui/OnlineReqSOAPBinding, ffp=AB, sendingsys=AB, jms_redelivered=false, OutboundRetroCorrelationKey=520a0ea3-465c-4b92-aa4c-ed32703aae5e, jms_replyTo=queue://PAI_RES_INTER_OUTQ, ws_soapAction=processRequest, correlationId=3d09b492-c4d8-f314-b18d-85dd740ae944, original-payload=SomeValueFromRequest, id=d13a807a-8b89-92d2-5b08-5b767f86774a, jms_messageId=ID:01HW370406-59320-1437824218347-1:5:1:1:1, receivingsys=SZ, timestamp=1437824234561}]
2015-07-25 17:07:14,561 DEBUG [org.springframework.integration.aggregator.AggregatingMessageHandler] org.springframework.integration.aggregator.AggregatingMessageHandler#0 received message: GenericMessage [payload=javax.xml.bind.JAXBElement@9f7158, headers={transaction_id=WSG91075596120150725170705797, sequenceNumber=1, sequenceSize=1, WsGwCorrelationID=5c57f681-9b08-4c6f-8bdb-c400dd5299a2, priority=4, jms_timestamp=1437824234313, uri=http://localhost:8082/OnlineSOAPBinding/soapui/OnlineReqSOAPBinding, ffp=AB, sendingsys=AB, jms_redelivered=false, OutboundRetroCorrelationKey=520a0ea3-465c-4b92-aa4c-ed32703aae5e, jms_replyTo=queue://PAI_RES_INTER_OUTQ, ws_soapAction=processRequest, correlationId=3d09b492-c4d8-f314-b18d-85dd740ae944, original-payload=SomeValueFromRequest, id=d13a807a-8b89-92d2-5b08-5b767f86774a, jms_messageId=ID:01HW370406-59320-1437824218347-1:5:1:1:1, receivingsys=SZ, timestamp=1437824234561}]
1
Can you post a DEBUG log showing the message flow through the filter? Don't put it in a comment, it won't render well; edit your question instead.Gary Russell
@Gary edited the question with the debug logs when the message passes through the filter.Vignesh

1 Answers

1
votes

Well, it doesn't work that way. Just because it is Gateway. So, jmsOutboundgateway does know nothing about the flow on the other side and it really isn't interested in. There is need just to have a reply from there, wrap it to the message and send to the reply-channel.

And the main word here is wrap. Having the original-payload header on the requestMessage any gateway implementation transfer them not only to that downstream flow (if protocol supports that, of course), but also to the replyMessage - AbstractReplyProducingMessageHandler:

@Override
protected final void handleMessageInternal(Message<?> message) {
    Object result;
....
    result = handleRequestMessage(message);
....
    sendOutputs(result, message);
}

....
if (this.shouldCopyRequestHeaders()) {
    builder.copyHeadersIfAbsent(requestHeaders);
}   

And so on.

So, for your case you should move (or copy?) your <int:header-filter> to the downstream flow on the reply-channel.