Spring Integration拆分器和聚合器配置

时间:2018-09-26 23:29:15

标签: spring spring-integration splitter spring-integration-dsl aggregator

我有一个场景,我需要并行调用A和B系统的REST调用,并汇总响应并将其转换为单个FinalResponse

要实现这一点,我正在使用Spring Integration splitter和agreggator,其配置如下所示。

我公开了一个REST端点,当请求(请求在标头中具有co-relationId)到达控制器时,我们调用网关,分离器将请求发送到A和B通道。  服务激活器A侦听通道A并调用A系统的REST调用,而服务激活器B侦听B通道并调用B系统的REST调用。  然后,我需要汇总来自A和B系统的响应,然后将其转换为FinalResponse。目前,聚合和转换工作正常。

有时候,向控制器发送多个请求时,与向控制器发送单个请求相比,FinalResponse花费的时间更多。对请求的所有响应几乎都在同一时间到来,不知道为什么(即使在第一个请求之后的6-7秒内向控制器发送了最后一个请求)。我的配置中与线程相关的地方有问题吗?不知道为什么当多个请求到达控制器时,需要花费更多时间进行响应。  另外,我没有使用任何CorrelationStrategy,我们需要使用它吗? 使用以下配置在多线程环境中会遇到任何问题吗?有关配置的任何反馈都将有所帮助

// Controller

     {
     FinalResponse aggregatedResponse = gateway.collateServiceInformation(inputData);

     }

     //Configuration 

     @Autowired
     Transformer transformer;

     //Gateway
     @Bean
        public IntegrationFlow gatewayServiceFlow() {
            return IntegrationFlows.from("input_channel")
                    .channel("split_channel").get();
        }

//splitter
     @Bean
     public IntegrationFlow splitAggregatorFlow() {
            return IntegrationFlows.from("split_channel").
                    .split(SomeClass.class, SomeClass::getResources)
                    .channel(c -> c.executor(Executors.newCachedThreadPool()))
                    .<Resource, String>route(Resource::getName,
                            mapping -> mapping.channelMapping("A", "A")
                                    .channelMapping("B", "B"))
                    .get();

        }

//aggregator
        @Bean
        public IntegrationFlow aggregateFlow() {
            return IntegrationFlows.from("aggregate_channel").aggregate()
                    .channel("transform_channel").transform(transformer).get();
        }
        .
        .
        .
    //Transformer   
    @Component
    @Scope("prototype")
    public class Transformer {

     @Transformer
        public FinalResponse transform(final List<Result> responsesFromAAndB) {
        //transformation logic and then return final response
       }
    }

1 个答案:

答案 0 :(得分:0)

拆分器为标头中的相关详细信息提供了默认策略。聚合器随后将使用它们。您所说的称为scatter-gatherhttps://docs.spring.io/spring-integration/docs/5.0.8.RELEASE/reference/html/messaging-routing-chapter.html#scatter-gather。有等效的Java DSL。

我认为您的问题是拆分集中的某个请求失败,因此Aggregator无法完成该请求的分组。到目前为止,您的配置中没有任何东西……