在发出请求时,JAX-RS"端点"的行为如何?

Rox*_*ana 5 java rest multithreading jax-rs

有些事情我不确定我理解是否正确,因此,我需要帮助:)

我见过这个:例子,

@Path("/resource")
public class Resource {
    @Context
    private HttpHeaders headers;

    @GET
    public void get(@Context UriInfo uriInfo) {
       /* use headers or uriInfo variable here */
    }
}
Run Code Online (Sandbox Code Playgroud)

这是否意味着对于每个请求,转换为"endpoint"的类会创建一个单独的线程?因为,否则,标题信息将不准确...

你能指出一个(短:))资源,而不是JAX-WS规范,在哪里可以找到关于这个的信息?

acd*_*ior 11

我想不出比JAX-RS 1.1规范本身更短更直接的资源.它是明确你所要求的:

JAX-RS提供了用于获取和处理有关应用程序部署上下文和各个请求的上下文的信息的工具.(......)

上下文特定于特定请求(...).

我可以添加完整性:通过@Context注释获取上下文信息.在资源方面,上下文信息仅适用于带注释的@Path(也称为根资源).此外,@Context可以注入下面的上下文类型:Application,UriInfo,HttpHeaders,Request,SecurityContextProviders.

关于生命周期(请求/线程管理):

3.1.1生命周期和环境

默认情况下,为每个 对该资源的请求创建一个新的资源类实例.首先调用构造函数,然后注入任何请求的依赖项(上下文是其中一个依赖项),然后调用适当的方法,最后使对象可用于垃圾回收.

实现可以提供其他资源类生命周期,指定这些的机制超出了本规范的范围.例如,基于控制反转框架的实现可以支持该框架提供的所有生命周期选项.

结论是:

  • 默认情况下,每个请求由不同的资源实例处理;
  • 在请求时注入上下文(因此每个实例具有不同的上下文).

每个特定实现可能会稍微改变此生命周期,但应保持原则(特定于每个请求的上下文).

正如您所看到的,规范也没有说明线程管理.由于大多数JAX-RS实现都是基于Servlet的,因此我们可以安全地假设每个请求实例都转到不同的线程 - 因为servlet容器是每个请求的线程.