Я использую 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;
}
}
Метод process
вызывается из метода внутри @RestController
:
@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.