У меня есть сценарий, в котором мне нужно параллельно вызывать 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
}
}