我正在像这样在 Spring Boot 中使用 Java 的 CompletableFuture @Service
:
@Service
public class ProcessService {
private static final ExecutorService EXECUTOR = Executors.newFixedThreadPool(3);
@Autowired
ChangeHistoryService changeHistoryService;
public Attribute process(Attribute attribute) {
//some code
CompletableFuture.runAsync(() -> changeHistoryService.logChanges(attribute), EXECUTOR);
return attribute;
}
}
从 @RestController
内的方法调用 process
方法:
@RestController
public class ProcessController {
@Autowired
ProcessService processService;
@RequestMapping(value = "/processAttribute",
method = {RequestMethod.POST},
produces = {MediaType.APPLICATION_JSON_VALUE},
consumes = {MediaType.APPLICATION_JSON_VALUE})
public Attribute applyRules(@RequestBody Attribute attribute) {
Attribute resultValue = processService.service(attribute);
return resultValue;
}
}
ChangeHistoryService::logChanges
仅根据其参数将一些数据保存到数据库中。
我有一个微服务,它向这个“/processAttribute”端点发出多个请求并打印所有响应。
当我在 logChanges
方法中放置断点时,微服务正在等待某些请求,但不是所有请求,这让我认为 ChangeHistoryService::logChanges
并不总是异步运行。如果我不为 runAsync
提供 ExecutorService,微服务会阻塞更多请求,但仍然不是全部。
据我了解,这是因为处理请求的方法和 logChanges 方法共享相同的线程池(ForkJoinPool?)。
无论如何,由于我有另一个 ExecutorService,logChanges
不应该独立运行吗?或者是关于 IDE 如何处理异步任务上的断点?我正在使用 IntelliJ IDEA。
最佳答案
关于java - 使用 Java CompletableFuture 方法时的同步行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48263227/