Настройка сплиттера и агрегатора Spring Integration - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть сценарий, в котором мне нужно параллельно вызывать REST-вызовы системы A и B, объединять ответы и преобразовывать их в один FinalResponse.

. Для этого я использую сплиттер и агрегатор Spring Integration.и конфигурация такая, как указано ниже.

Я выставил конечную точку REST, когда запрос (запрос имеет co -lationId в заголовке) приходит к контроллеру, мы вызываем шлюз, и сплиттер отправляет запросы A иB каналов.Активатор службы A прослушивает канал A и вызывает вызов REST системы A, а активатор службы B прослушивает канал B и вызывает вызов REST системы B.Затем мне нужно объединить ответы от системы A и B, а затем преобразовать их в FinalResponse.В настоящее время агрегация и преобразование работают нормально.

Иногда, когда к контроллеру поступает несколько запросов, FinalResponse занимает больше времени по сравнению с одним запросом к контроллеру.Все ответы на запросы приходят почти одновременно, не знаю почему (хотя последний запрос к контроллеру был отправлен через 6-7 секунд после 1-го запроса).Что-то не так в моей конфигурации, связанной с потоками?Не уверен, почему требуется больше времени для ответа, когда на контроллер поступает несколько запросов.Кроме того, я не использую 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 голосов
/ 28 сентября 2018

Разделитель предоставляет стратегию по умолчанию для деталей корреляции в заголовках.Агрегатор будет использовать их потом.То, о чем вы говорите, называется scatter-gather: https://docs.spring.io/spring-integration/docs/5.0.8.RELEASE/reference/html/messaging-routing-chapter.html#scatter-gather. Существует эквивалент Java DSL.

Я думаю, что ваша проблема в том, что какой-то запрос в разделенном наборе не выполняется, поэтому Aggregator не может завершитьгруппа для этого запроса.Ничего очевидного в вашей конфигурации пока нет ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...