2013-02-16 5 views
3

Я создаю веб-службу REST, которая должна быть работоспособной. Рассмотрим следующую ситуацию:Java EE 6 - Stateful REST as Session session bean

  1. Веб-сервис выполняет сложные и трудоемкие вычисления и возвращает очень большой результат. Таким образом, эта служба возвращает только количество результатов, и весь результат сохраняется на сервере в компоненте stateful.
  2. Если результат существует. Клиент может запросить подмножество существующих результатов.

Я пытаюсь сделать это через @Stateful сеанс bean, но он по-прежнему действует как @Stateless. Теперь мне интересно, возможно ли это, потому что Клиент не принимает Cookie, поэтому сервер не может его идентифицировать.

Возможно ли, что с помощью REST можно использовать компонент Stateful 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.

Смежные вопросы