Patrik Mihalčin
Patrik Mihalčin

Reputation: 4031

Reuse SimpleWebServiceOutboundGateway in multiple IntegrationFlows in Spring Integration

Given I have 2 IntegrationFlows which reference the same SimpleWebServiceOutboundGateway bean:

@Bean
IntegrationFlow getDataA(
        Jaxb2Marshaller xmlMarshaller,
        SimpleWebServiceOutboundGateway webServiceOutboundGateway) {
    return IntegrationFlows.from("getDataA")
            .transform(marshaller(xmlMarshaller))
            .transform(new ResultToStringTransformer())
            .handle(webServiceOutboundGateway)
            .transform(unmarshaller(xmlMarshaller))
            .get();
}

@Bean
IntegrationFlow getDataB(
        Jaxb2Marshaller xmlMarshaller,
        SimpleWebServiceOutboundGateway webServiceOutboundGateway) {
    return IntegrationFlows.from("getDataB")
            .transform(marshaller(xmlMarshaller))
            .transform(new ResultToStringTransformer())
            .handle(webServiceOutboundGateway)
            .transform(unmarshaller(xmlMarshaller))
            .get();
}

@Bean
SimpleWebServiceOutboundGateway webServiceOutboundGateway(HttpComponentsMessageSender httpComponentsMessageSender) {
    SimpleWebServiceOutboundGateway outboundGateway = new SimpleWebServiceOutboundGateway("url");
    outboundGateway.setMessageSender(httpComponentsMessageSender);
    return outboundGateway;
}

When I execute the code I am getting:

Caused by: java.lang.IllegalArgumentException: An AbstractMessageProducingHandler may only be referenced once (webServiceOutboundGateway) - use @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) on @Bean definition.

When I add @Scope(SCOPE_PROTOTYPE) to webServiceOutboundGateway, I'm getting the same exception

How can I reuse webServiceOutboundGateway in both flows?

Upvotes: 0

Views: 213

Answers (1)

Gary Russell
Gary Russell

Reputation: 174729

I just copied your code into a new app, fixed the channel names and putting the gatway in prototype scope worked for me...

@Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
SimpleWebServiceOutboundGateway webServiceOutboundGateway() {
    SimpleWebServiceOutboundGateway outboundGateway = new SimpleWebServiceOutboundGateway("url");
    return outboundGateway;
}

Upvotes: 0

Related Questions