JAX-RS使用哪种方法进行异步通信?

时间:2014-07-11 18:33:00

标签: web-services rest asynchronous jax-rs

我需要在异构环境中使用REST服务(使用JAX-RS实现构建),因此我想知道如何将编程语言的抽象转换为真正的休息端点。我认为大多数方面都很清楚,但是当谈到REST中的异步通信时,我知道几种可能性:保持连接打开,返回可以不断查询的资源,分块消息或客户端传输回调资源。

我的方法是阅读JAX-RS 2.0 Specification,但我认为实际上很少有关于异步请求的REST实现的陈述。然后我读了Jersey documentation并得出结论,只要处理需要,JAX-RS实现就会保持连接打开。所以用"异步" JAX-RS只是指在服务器/客户端上阻塞方法,并且不使用REST的任何特殊行为。我的第一个问题:我的分析是否正确?

如果是这种情况,我有两个新问题:

  • 这是否真的符合关于无状态约束的REST范例?
  • 考虑到长时间运行的流程可能会工作几天,最终是否会自动关闭(例如,通过操作系统或TCP计时器)?

提前致谢!

1 个答案:

答案 0 :(得分:1)

REST架构与异步编程范例IMO无关。在JAX-RS中使用@Suspended和AsynResponse接口的异步实现涉及挂起发起请求的线程

回答你的问题

  1. '所以用"异步" JAX-RS只是指在服务器/客户端上阻塞方法,并且不使用REST的任何特殊行为'
  2. - > REST与JAX-RS中的异步设计无关,但是设计Resource类和设置异步方法的方式应该涉及RESTful原则。 此外,没有阻止'因此 - 实际上恰恰相反。服务器端的I / O线程立即挂起并返回到容器。实际处理可能仍需要很长时间,但真正的目标是“不阻止”。并占据线程。 Web容器具有专用于提供输入请求的有限数量的线程。如果所有容器线程都忙于处理其他客户端,则潜在客户将被阻止。这是通过JAX-RS避免的,因为它挂起线程,将其返回到Web容器并在不同的线程(内部服务器线程)上响应。所有这些都提高了应用程序的整体响应能力

    1. '考虑到长时间运行的流程可能会持续数天,最终是否会自动关闭(例如通过操作系统或TCP计时器)开放式连接?'
    2. - >不确定如果发生这种情况会发生什么。但没有必要让您的客户永远等待'永远' - 你可以使用TimeoutHandler指定超时(猜你可能已经读过这个)

      只是我的两分钱!