启动后台任务的同步泽西休息服务?

jer*_*edt 4 asynchronous jersey

这是我遇到的问题,它与设计和实现有关:

我有一个接受POST请求的REST Web服务.没什么特别的.它目前同步响应.

但是,此Web服务将启动可能需要很长时间的后台进程.

我不希望这项服务在30分钟后回复.

相反,它应该立即向客户端返回一个ack响应,而不是更多(即使在30分钟后,也没有更多的信息要发送).

如何使用Jersey实现此类行为?

我阅读了https://jersey.java.net/nonav/documentation/2.0/async.html#d0e6914页面.

虽然这是一个有趣的阅读,但我没有找到只发送ACK类型响应(类似于HTTP 200代码)的方法.

也许我对异步和我想要实现的行为感到困惑.

我只知道我可以在@POST方法中创建一个新的Thread来处理后台进程,并立即返回ACK响应.

但是,在将响应发送回客户端后,这个新线程是否存在?

你会如何实现这个WS?

我希望你能帮助我澄清这一点.

The*_*ect 5

我认为您链接的Jersey 2异步服务器API仍将保持客户端连接,直到处理完成.异步处理实际上是Jersey的内部处理,不会影响客户端体验.

如果要返回ACK,可以使用常规Jersey方法,将工作委托给另一个线程,然后立即返回.我推荐这个用例的HTTP 202.

您可以创建一个Thread来执行此操作,就像在Jersey 2示例中一样,它可以在执行Jersey资源方法调用时继续存在:

@POST
public Response asyncPost(String data) {
    new Thread(...).start();
    return Response.status(Response.Status.ACCEPTED).build();
}
Run Code Online (Sandbox Code Playgroud)

这就是说,在app服务器中通常不建议创建线程.

如果您使用的是EE7,我建议您查看JSR-236 http://docs.oracle.com/javaee/7/api/javax/enterprise/concurrent/package-summary.html

如果您正在使用EE6,则可以考虑将消息发送到队列,以便在后台由消息驱动Bean(MDB)处理.