2013-02-16 105 views
3

我正在创建需要有状态的REST Web服务。考虑以下情况:Java EE 6 - 作为有状态会话bean的有状态REST

  1. Web服务执行困难和耗时的计算并返回非常大的结果。所以这个服务只返回一些结果,整个结果保存在有状态bean的服务器上。
  2. 当结果存在时。客户可以询问现有结果的一部分。

我试图通过@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

回答

6

你应该注释与@SessionScoped你的资源类,以告诉JAX -RS创建会话生存期的请求对象,否则默认为@RequestScoped