JavaEE6-有状态REST作为有状态会话bean

JavaEE6-有状态REST作为有状态会话bean,java,web-services,rest,jakarta-ee,web-applications,Java,Web Services,Rest,Jakarta Ee,Web Applications,我正在创建需要有状态的RESTWeb服务。考虑以下情况: Web服务执行困难且耗时的计算,并返回非常大的结果。所以这个服务只返回一些结果,整个结果保存在服务器上的有状态bean中 当结果存在时。客户可以要求现有结果的子集 我试图通过@Stateful会话bean实现这一点,但它的行为仍然类似于@Stateless。现在我想知道这是否可能,因为客户端不接受任何Cookie,所以服务器无法识别它 是否可以通过REST访问有状态bean 代码示例: @Path("/similarity/") @Pro

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

  • Web服务执行困难且耗时的计算,并返回非常大的结果。所以这个服务只返回一些结果,整个结果保存在服务器上的有状态bean中
  • 当结果存在时。客户可以要求现有结果的子集
  • 我试图通过
    @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());
            }
        }
    
    }
    
    @Path(“/similarity/”)
    @产生({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})
    @使用({MediaType.APPLICATION\uxml,MediaType.APPLICATION\ujson})
    @有状态
    @StatefulTimeout(600000)//10分钟
    公共类相似资源{
    私有列表savedSimilarityResults=new ArrayList();
    @职位
    @路径(“/atom count/”)
    公共列表原子计数相似性(JAXBElement sr){
    试一试{
    if(this.savedSimilarityResults.isEmpty()){
    List similarityResults=acs.findAllSimilar();//耗时
    this.savedSimilarityResults=similarityResults;//保存结果
    返回相似结果;
    }否则{
    CompoundResponse cr=新的CompoundResponse(“Hureey stateful bean works!”,404);
    抛出新的WebApplicationException(cr.buildResponse());
    }
    }捕获(复合搜索异常e){
    复合响应cr=新的复合响应(500,e);
    抛出新的WebApplicationException(cr.buildResponse());
    }
    }
    }
    

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

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