Spring: немедленный возврат ответа через Rest API и предоставление сервисному слою возможности обрабатывать запрос - PullRequest
0 голосов
/ 10 марта 2020

В моем приложении у меня есть следующий сценарий: когда клиент через 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();
    }
...