Java jersey glassfish (payara) 休息 : get status on running async method

标签 java jakarta-ee jersey payara

我正在处理这个项目,需要大量处理和时间,我希望通过对后端的 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/

相关文章:

java - 使用来自不同 Iterator/Iterable 的值创建 Iterable

java - com.google.gson.internal.LinkedTreeMap 无法转换为我的类

java - Seam Faces 导致部署时错误

jakarta-ee - 当应用程序部署在 tomcat 的 webapps 中的文件夹内时数据源失败

java - GSON 需要 BEGIN_ARRAY 但实际是 BEGIN_OBJECT

java - 具有副作用的不可变对象(immutable对象)

hibernate - 在 eclipse 中使用 wildfly 的 postgres 数据库

jakarta-ee - 将 JAX-RS bean 验证错误消息绑定(bind)到 View

java - 找不到媒体类型 = application/json 的 MessageBodyReader - android

java - Java中BST的层序遍历