模块化Spring Integration Gateway

时间:2018-09-25 16:18:59

标签: spring-integration spring-integration-dsl

在尝试对Spring Integration流进行模块化时,我开始使用一种模式,其中将入站和出站网关放在单独的类中,然后在需要时导入它们以构建流。例如,这是一个最小的集成测试,显示了一种粗略的方法:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = { SampleIntegrationFlowTest.class })
@SpringIntegrationTest
@EnableIntegration
public class SampleIntegrationFlowTest {

    @Autowired
    private InboundGateways inboundGateways;

    @Autowired
    private OutboundGateways outboundGateways;

    @Test
    public void testFlow1() {
        StandardIntegrationFlow flow = IntegrationFlows
            .from(inboundGateways.createAccount())
            .transform(new JsonToXmlTransformer())
            .handle(outboundGateways.soapAccount())
            .transform(new XmlToJsonTransformer())
            .get();

        flow.start();
    }

    @Test
    public void testFlow2() {
        StandardIntegrationFlow flow = IntegrationFlows
            .from(inboundGateways.searchAccount())
            .transform(new JsonToXmlTransformer())
            .handle(outboundGateways.soapAccount())
            .transform(new XmlToJsonTransformer())
            .get();

        flow.start();
    }

    @Configuration
    static class InboundGateways {

        @Gateway
        public MessagingGatewaySupport createAccount() {
            return WebFlux.inboundGateway("/accounts")
                .requestMapping(mapping -> mapping
                    .consumes("application/json")
                    .produces("application/json")
                    .methods(HttpMethod.POST))
                .get();
        }

        @Gateway
        public MessagingGatewaySupport searchAccount() {
            return WebFlux.inboundGateway("/accounts")
                .requestMapping(mapping -> mapping
                    .produces("application/json")
                    .methods(HttpMethod.GET))
                .headerExpression("name", "#requestParams.name")
                .get();
        }

    }

    @Configuration
    static class OutboundGateways {

        @Gateway
        public MessageHandler soapAccount() {
            return new SimpleWebServiceOutboundGateway("http://example.com/accounts");
        }

    }
}

我以这种方式构造它,以便可以:

  1. 将入站网关分组在一起,以便我可以从Swagger合同生成InboundGateways类。
  2. 能够重用来自多个流的出站网关(多个入站其余端点路由到同一出站肥皂端点)。

问题:

  1. 我的安排方式是否有不利之处?根据上述目标,有什么方法可以改善它?
  2. 是否有机会将入站网关“建模”为带有@ MessagingGateway / @ Gateway注释的接口,以便我可以像普通的pojo一样与它们进行交互?在集成到现有代码中或通过集成测试时,这可能很有用。如果有办法,我不知道如何做类似Webflux.inboundGateway(

1 个答案:

答案 0 :(得分:0)

  1. 其中的@Gateway注释不起作用。

我认为您的方法没有问题;您将无法重复使用出站网关(如果声明为@Bean,则可以使用)。这是因为任何产生回复的MessageHandler只能有一个输出通道。

  1. 否; @MessagingGateway用于创建GatewayProxyFactoryBean-用于从旧版Java代码连接到集成流。