5

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

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

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

我不希望此服务在 30 分钟后响应。

相反,它应该立即向客户端返回一个 ack 响应,仅此而已(即使在 30 分钟后,也不会再发送任何信息)。

如何使用 Jersey 实现这种行为?

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

虽然读起来很有趣,但我没有找到只发送 ACK 类型的响应(类似于 HTTP 200 代码)的方法。

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

我刚刚明白我可以在我的@POST 方法中创建一个新线程来处理后台进程,并立即返回 ACK 响应。

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

你将如何实现这个 WS ?

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

4

1 回答 1

5

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

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

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

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

话虽如此,通常不建议在应用服务器中创建线程。

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

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

于 2013-07-09T22:57:02.667 回答