我正在处理这个项目,需要大量处理和时间,我希望通过对后端的 API 调用来启动该过程。
现在,我在使用 Payara 作为服务器的开发环境中拥有 Jersey 和 Jackson 以及 Maven。
我试图让用户只需在 Web 界面中按“开始”即可开始在后台处理长任务,并且 JSON 请求可以获取状态更新,直到任务完成。
这是我的(非常糟糕的)测试代码,我用它来尝试了解该过程。任务是否在所有用户之间共享并不重要,因为该项目只是一个原型(prototype)。
ExecutorService task = Executors
.newCachedThreadPool(new ThreadFactoryBuilder().setNameFormat("long-running-resource-executor-%d")
.setUncaughtExceptionHandler(new JerseyProcessingUncaughtExceptionHandler()).build());
AsyncResponse asyncBla;
@GET
@Path("/expensive")
public void getExpensive(@Suspended final AsyncResponse async) {
asyncBla = async;
task.submit(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(10000);
System.out.println("Ba-boop");
} catch (InterruptedException e) {
System.out.println("barp");
}
// async.resume("Started");
}
});
async.resume("Started");
}
@GET
@Path("/expensive/status")
public String getExpensiveStatus() {
if (asyncBla == null)
return "Nope.";
return asyncBla.isDone();
}
最佳答案
您可以尝试以下方法:
@Singleton
@Path("expensive-task")
public class ExpensiveTaskResource {
private ExecutorService executor;
private Future<String> futureResult;
@PostConstruct
public void onCreate() {
this.executor = Executors.newSingleThreadExecutor();
}
@POST
public Response startTask() {
futureResult = executor.submit(new ExpensiveTask());
return Response.status(Status.ACCEPTED).build();
}
@GET
public Response getResult() throws ExecutionException, InterruptedException {
if (futureResult != null && futureResult.isDone()) {
return Response.status(Status.OK).entity(futureResult.get()).build();
} else {
return Response.status(Status.FORBIDDEN).entity("Try later").build();
}
}
@PreDestroy
public void onDestroy() {
this.executor.shutdownNow();
}
}
public class ExpensiveTask implements Callable<String> {
@Override
public String call() throws Exception {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Task completed";
}
}
关于Java jersey glassfish (payara) 休息 : get status on running async method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49799487/