带有异步 servlet 的 JAX-WS

JAX-WS with async servlets

所以,我有这个旧的遗留 JAX-WS 服务,它为每个请求执行大量 IO,因此每个请求都需要相当多的时间,但不会消耗太多 CPU/RAM。

最近客户端越来越多,线程匮乏的问题越来越严重。

起初,我考虑过实现 JAX-WS 内置异步支持,但它需要客户端知道它,而在我的情况下这是不行的。我不可能强迫他们都更新他们的代码。

我目前的想法是创建特殊的异步 servlet 并手动解析 SOAP 请求并对响应进行编码,但我似乎找不到一些好的方法来做到这一点。

在处理 JAX-WS 请求时,有什么方法可以利用 Servlet 3.1 异步支持吗?

我应该澄清一下,我不能使用某种队列,否则 "just return early",因为请求处理可能会失败,而客户端必须得到那个失败。

你可以在这里使用工作流,假设你有网络服务器的工作人员接受请求,你处理它并将它放在一个由线程共享的队列中,线程将异步处理这个事件。

这仅意味着您在客户端的等待时间很短并且您异步处理客户端请求。通过这种方式,您可以构建可扩展的系统,并且可以增加任一端的工作线程数量,即网络服务器,因此您可以同时接受来自客户端的多个请求,同时多个线程可以同时处理来自客户端的事件。

我找到了最适合我的解决方案,CXF Continuations API。

http://cxf.apache.org/docs/continuations.html

https://github.com/search?l=java&q=ContinuationProvider&type=Code&utf8=%E2%9C%93

我必须为 CXF Servlet 启用异步,并将 jboss 模块依赖项添加到捆绑的 CXF。

虽然整个事情感觉有点像 hack,但它允许我进行适当的异步处理,而无需更改外部服务 API。 作为奖励,我什至可以决定是暂停请求,还是正常处理请求,这在某些情况下很有帮助。