В моем приложении у меня есть следующий сценарий: когда клиент через Restful API отправляет запрос, он сохраняется в базе данных и его идентификатор сохраненного объекта возвращается клиенту. Позже, используя планировщик (т.е. @Scheduler
), запрос, сделанный ранее, извлекается из базы данных и обрабатывается. Таким образом, клиент немедленно получает свой ответ через Restful API (точнее: идентификатор результата, но не сам результат), а сам результат вычисляется позже, поскольку он отнимает много времени. Интересно, есть ли лучшие варианты.
А именно, я думал о написании Rest API, где веб-слой передает объект домена проигрывателю сервиса. Служебный уровень сохраняет этот объект домена в базе данных, затем возвращает идентификатор объекта домена в веб-слой и, наконец, выполняет задачу, требующую много времени.
Прочитав о CompletableFuture
, я решил дать ему попытка Тем не менее, мой код все еще ожидает завершения трудоемкой задачи и только потом возвращает идентификатор веб-слою. Пожалуйста, посмотрите (очень упрощенный) пример:
public int completableFuture(Dto dto) {
Domain domain = saveToDB(dto);
CompletableFuture.supplyAsync(this::calculateTimeConsumingTask) // accepts domain object
.thenAcceptAsync(this::saveResult);
return domain.getId();
}