这是我遇到的问题,与设计和实现相关:
我有一个接受POST请求的REST Web服务。没什么特别的。它目前同步响应。
但是,此Web服务将启动可能需要很长时间的后台进程。
我不希望这项服务在30分钟后回复。
相反,它应该立即向客户端返回一个确认响应,而不是更多(即使在30分钟后,也没有更多的信息要发送)。
如何使用Jersey实现此类行为?
我阅读了https://jersey.java.net/nonav/documentation/2.0/async.html#d0e6914页。
虽然这是一个有趣的阅读,但我没有找到只发送ACK类型响应的方法(类似于HTTP 200代码)。
也许我对异步和我想要实现的行为感到困惑。
我只是理解我可以在@POST方法中创建一个新线程来处理后台进程,并立即返回ACK响应。
但是,在将响应发送回客户端后,这个新线程是否存在?
你将如何实现这个WS?
我希望你能帮助我澄清这一点。
答案 0 :(得分: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();
}
这就是说,在app服务器中通常不建议创建线程。
如果您使用的是EE7,我建议您查看JSR-236 http://docs.oracle.com/javaee/7/api/javax/enterprise/concurrent/package-summary.html
如果您正在使用EE6,则可以考虑将消息发送到队列,以便在后台由消息驱动Bean(MDB)处理。