I have this Spring Integration code that receives a SOAP message and then replies it.
This is the configuration:
@Bean
public MessageChannel wsGatewayInboundChannel() {
return MessageChannels.direct(GATEWAY_INBOUND_CHANNEL_NAME).get();
}
@Bean
public MessageChannel wsGatewayOutboundChannel() {
return MessageChannels.direct(GATEWAY_OUTBOUND_CHANNEL_NAME).get();
}
@Bean
public IntegrationFlow soapMessageFlow(SimpleWebServiceInboundGateway webServiceInboundGateway) {
return IntegrationFlows.from(webServiceInboundGateway)
.log(LoggingHandler.Level.INFO)
.channel(SOAP_MESSAGE_SERVICE_CHANNEL_NAME).get();
}
@Bean
public SimpleWebServiceInboundGateway webServiceInboundGateway() {
SimpleWebServiceInboundGateway simpleWebServiceInboundGateway = new SimpleWebServiceInboundGateway();
simpleWebServiceInboundGateway.setRequestChannel(wsGatewayInboundChannel());
simpleWebServiceInboundGateway.setReplyChannel(wsGatewayOutboundChannel());
simpleWebServiceInboundGateway.setExtractPayload(false);
simpleWebServiceInboundGateway.setLoggingEnabled(true);
return simpleWebServiceInboundGateway;
}
And this is the service that processes the message:
@Service
public class SoapMessageService {
@ServiceActivator(inputChannel = SOAP_MESSAGE_SERVICE_CHANNEL_NAME, outputChannel = GATEWAY_OUTBOUND_CHANNEL_NAME)
public SoapMessage receive(SoapMessage request) {
//...
return reply;
}
}
This works fine.
I don't know how the reply channel works behind the curtains, but I want to be really sure that replies don't mix up. For instance, if I receive:
Request_1 from A, which reply is Reply_1
Request_2 from B, which reply is Reply_2
I want Reply_1 to be delivered to A and Reply_2 to be delivered to B and NOT Reply_1 being delivered to B and Reply_2 being delivered to A.
Can reply channel guarantee the behaviour previously described?
Thanks in advance.
They do guarantee. The gateway implementation in Spring Integration us fully based on the
Return AddressEI pattern: https://www.enterpriseintegrationpatterns.com/patterns/messaging/ReturnAddress.html.Every gateway request is set with a
replyChannelheader to theTemporaryReplyChannel. When nooutputChannelconfigured downstream, the framework consults that header to deliver the current message.In most cases we really don't need that
setReplyChannelto be configured on the inbound gateway. Just because we simply can rely on thereplyChannelheader.See more info in docs: https://docs.spring.io/spring-integration/docs/current/reference/html/messaging-endpoints.html#gateway-default-reply-channel
And also this GH issue: https://github.com/spring-projects/spring-integration/issues/3985
There see if it would make sense for your to get rid off that
GATEWAY_OUTBOUND_CHANNEL_NAMEat all everywhere.