我有一个场景,我需要并行调用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
}
}
答案 0 :(得分:0)
拆分器为标头中的相关详细信息提供了默认策略。聚合器随后将使用它们。您所说的称为scatter-gather
:https://docs.spring.io/spring-integration/docs/5.0.8.RELEASE/reference/html/messaging-routing-chapter.html#scatter-gather。有等效的Java DSL。
我认为您的问题是拆分集中的某个请求失败,因此Aggregator无法完成该请求的分组。到目前为止,您的配置中没有任何东西……