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

时间:2013-06-11 13:10:37

标签: java multithreading rest jax-rs

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

我见过这个:example

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

    @GET
    public void get(@Context UriInfo uriInfo) {
       /* use headers or uriInfo variable here */
    }
}

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

请注明一个(简短:))资源,而不是JAX-WS规范,我可以在哪里找到有关这方面的信息?

1 个答案:

答案 0 :(得分:11)

我想不出比JAX-RS 1.1 spec itself更短更直接的资源。很清楚what you are asking

  

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

     

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

我可以添加完整性:通过@Context注释获取上下文信息。截至资源,上下文信息仅适用于使用@Path注释的(也称为根资源)。此外,@Context可以注入以下context typesApplicationUriInfoHttpHeadersRequestSecurityContext和{{1} }}

关于lifecycle(请求/线程管理):

  

3.1.1生命周期与环境

     

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

     

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

结论是:

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

每个特定的实现可能会稍微改变这个生命周期,但应该维护原则(特定于每个请求的上下文)。

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