У меня есть требование в моем проекте, где пользователь вызывает REST API - POST Operation для выполнения задачи длительного ожидания, теперь вместо того, чтобы заставлять пользователя ждать, мы хотим немедленно уведомить пользователя, говоря «Задача принята», и вфоновый запуск другого потока для выполнения длинной задачи.
Я попробовал приведенный ниже код, но в тот момент, когда API возвращает другие потоки, они не регистрируют никаких сообщений или не выполняют никаких задач.Чего мне не хватает здесь.
@POST
@Path("/longtask")
@Consumes(MediaType.APPLICATION_JSON)
public Response longTask() {
LOGGER.info("longTask started by Thread: "+Thread.currentThread().getName());
executor.submit(
new Runnable() {
@Override
public void run() {
new AsyncService().longTask();
}
});
LOGGER.info("longTask completed by Thread: "+Thread.currentThread().getName());
return Response.ok(new MyResponse<>("Task Accepted")).build();
}
AsyncService
public class AsyncService {
/**
*
*/
public void longTask(){
LOGGER.info("AsyncService - longTask() Started: "+Thread.currentThread().getName());
try{
//Tried thenAcceptAsync as well
CompletableFuture.supplyAsync(new MyAsyncSupplier()).thenAccept(new MyAsyncConsumer());
}finally{
LOGGER.info("AsyncService - longTask() Completed: "+Thread.currentThread().getName());
}
}
}
MyAsyncSupplier () и MyAsyncConsumer () - это некоторые задачи, которые вызывают БД и выполняют задачу длительного ожидания.Регистраторы под MyAsyncSupplier () и MyAsyncConsumer () не печатаются.Я попробовал то же самое только с примером проекта Java и метода main (), и то же самое произошло.В тот момент, когда основной завершает System.out's не распечатываются.
[744832b5-deed-4043-11-111] [myproject] 2018-10-08 18:19:16,836 [http-nio-8080-exec-31] INFO mypackage.MyResource - longTask started by Thread: http-nio-8080-exec-31
[744832b5-deed-4043-11-111] [myproject] 2018-10-08 18:19:16,836 [http-nio-8080-exec-31] INFO mypackage.MyResource - longTask completed by Thread: http-nio-8080-exec-31
[] [] 2018-10-08 18:19:16,837 [pool-64-thread-1] INFO mypackage.AsyncService - AsyncService - longTask() Started: pool-64-thread-1
[744832b5-deed-4043-11-11] [myproject] 2018-10-08 18:19:16,844 [http-nio-8080-exec-31] DEBUG mypackage.InitializationResponseFilter - Media Type set to : application/json
Как я могу продолжить выполнение этой задачи?
CompletableFuture.supplyAsync(new MyAsyncSupplier()).thenAccept(new MyAsyncConsumer());
Обновление 1:
Приведенный выше код не работал из-за некоторых классов MyAsyncSupplier и MyAsyncConsumerПроблемы с назначением объектов.Я продолжил отладку кода, и после исправления он работал.
Обновление 2:
На самом деле не было необходимости отправлять запрос исполнителю.
@POST
@Path("/longtask")
@Consumes(MediaType.APPLICATION_JSON)
public Response longTask() {
LOGGER.info("longTask started by Thread: "+Thread.currentThread().getName());
new AsyncService().longTask();
LOGGER.info("longTask completed by Thread: "+Thread.currentThread().getName());
return Response.ok(new MyResponse<>("Task Accepted")).build();
}