如何在控制器中执行两个单声道并行任务。 Spring WebFlux
How to execute two Mono parrallel tasks in controller. Spring WebFlux
调用controller时,需要启动两个provider。其中之一(personProvider)必须在后台完成其工作并将数据写入 Redis 缓存(我在这里不需要他的工作结果)。我需要将第二个 (accountsProvider) 的结果映射并发送到调用服务。请告诉我如何 运行 它们并行。我的解决方案不起作用,因为它们始终如一地执行。
@GetMapping(value = "/accounts", produces = MediaType.APPLICATION_JSON_VALUE)
public Mono<myDTO> accountsController(@RequestHeader("Channel") String channel,
@RequestHeader("Session") String sessionId) {
return clientSessionProvider.getClientSession(sessionId, channel) // return Mono<String>
.flatMap(clientData-> {
personProvider.getPersonCard(clientData) // My background task return Mono<PersonCard>
.subscribeOn(Schedulers.boundedElastic());
return accountsProvider.getAccounts(clientData) // return Mono<Accounts>
.subscribeOn(Schedulers.boundedElastic());
})
.map(myDTOMapper::map);
}
我创建静态调度程序作为我的控制器的字段class:
private static final Scheduler backgroundTaskScheduler = Schedulers.newParallel("backgroundTaskScheduler", 2);
public Mono<myDTO> accountsController(@RequestHeader("Channel") String channel,
@RequestHeader("Session") String sessionId) {
return clientSessionProvider.getClientSession(sessionId, channel)
.flatMap(clientData-> {
backgroundTaskScheduler.schedule(() -> personProvider.getPersonCard(clientData));
return accountsProvider.getAccounts(clientData);
})
.map(myDTOMapper::map);
在这种情况下,我的 personProvider 在其他线程中启动并且不会阻止来自控制器的响应。
调用controller时,需要启动两个provider。其中之一(personProvider)必须在后台完成其工作并将数据写入 Redis 缓存(我在这里不需要他的工作结果)。我需要将第二个 (accountsProvider) 的结果映射并发送到调用服务。请告诉我如何 运行 它们并行。我的解决方案不起作用,因为它们始终如一地执行。
@GetMapping(value = "/accounts", produces = MediaType.APPLICATION_JSON_VALUE)
public Mono<myDTO> accountsController(@RequestHeader("Channel") String channel,
@RequestHeader("Session") String sessionId) {
return clientSessionProvider.getClientSession(sessionId, channel) // return Mono<String>
.flatMap(clientData-> {
personProvider.getPersonCard(clientData) // My background task return Mono<PersonCard>
.subscribeOn(Schedulers.boundedElastic());
return accountsProvider.getAccounts(clientData) // return Mono<Accounts>
.subscribeOn(Schedulers.boundedElastic());
})
.map(myDTOMapper::map);
}
我创建静态调度程序作为我的控制器的字段class:
private static final Scheduler backgroundTaskScheduler = Schedulers.newParallel("backgroundTaskScheduler", 2);
public Mono<myDTO> accountsController(@RequestHeader("Channel") String channel,
@RequestHeader("Session") String sessionId) {
return clientSessionProvider.getClientSession(sessionId, channel)
.flatMap(clientData-> {
backgroundTaskScheduler.schedule(() -> personProvider.getPersonCard(clientData));
return accountsProvider.getAccounts(clientData);
})
.map(myDTOMapper::map);
在这种情况下,我的 personProvider 在其他线程中启动并且不会阻止来自控制器的响应。