Java EE 6 - 有状态REST作为有状态会话bean

时间:2013-02-16 13:14:24

标签: java web-services rest java-ee web-applications

我正在创建需要有状态的REST Web服务。请考虑以下情况:

  1. Web服务执行困难且耗时的计算并返回非常大的结果。因此,此服务仅返回结果数,并且整个结果将保存在有状态bean中的服务器上。
  2. 结果存在时。客户可以要求提供现有结果的子集。
  3. 我正在尝试通过@Stateful会话bean执行此操作,但它仍然像@Stateless一样。现在我想知道它是否可能,因为客户端不接受任何Cookie,因此服务器无法识别它。

    是否可以通过REST接收有状态bean?

    代码示例:

    @Path("/similarity/")
    @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
    @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
    @Stateful
    @StatefulTimeout(600000) // 10 minutes
    public class SimilarityResource {
    
        private List<SimilarityResult> savedSimilarityResults = new ArrayList<SimilarityResult>();
    
        @POST
        @Path("/atom-count/")
        public List<SimilarityResult> atomCountSimilarity(JAXBElement<SimilarityRequestXML> sr) {
    
            try {
                if (this.savedSimilarityResults.isEmpty()) {
    
                    List<SimilarityResult> similarityResults = acs.findAllSimilar(); // Time consuming
    
                    this.savedSimilarityResults = similarityResults; // Save results
                    return similarityResults;
                } else {
                    CompoundResponse cr = new CompoundResponse("Hureeey stateful bean works!.", 404);
                    throw new WebApplicationException(cr.buildResponse());
                }
    
            } catch (CompoundSearchException e) {
                CompoundResponse cr = new CompoundResponse(500, e);
                throw new WebApplicationException(cr.buildResponse());
            }
        }
    
    }
    

    我的期望是,当我将此/atom-count/方法调用两次时,它应该以404响应。

1 个答案:

答案 0 :(得分:6)

您应该使用@SessionScoped注释您的资源类,以告知JAX-RS创建具有会话生存期的请求对象,否则默认为@RequestScoped