Как внедрить HttpSessions с областью запроса в методы sitebricks в GAE?

У меня есть следующий сервлет sitebricks. Foo.get() доступен как GET в /foo/bar. Я развернул сервлет в GAE.

@Service
@At("/foo")
@Singleton
public class Foo {
  @Get
  @At("/bar")
  public Reply<?> bar(Request<String> request, HttpSession session) {
    // access request scoped HttpSession 
  }
}

Если я правильно понимаю sitebricks, и Request, и HttpSession внедряются sitebricks (возможно, с помощью Guice ). Это также гарантирует, что HttpSession является локальным для текущего запроса. Параллельные запросы будут выполняться для одного и того же экземпляра Foo, поскольку класс помечен @Singleton (см. документы Guice). Но даже при одновременных запросах, поступающих на одну и ту же JVM, каждый вызов bar() будет иметь свой собственный HttpSession на основе JSESSIONID, переданного клиентом. Верны ли все эти предположения?

При выполнении нагрузочных тестов для моего приложения я заметил, что при очень низкой скорости HttpSession, переданный sitebricks/Guice, имеет значение null. В настоящее время я устраняю эту проблему с помощью службы поддержки Google. Но помимо GAE - что может быть причиной этого с точки зрения sitebricks/Guice?

Я найден фрагмент кода, который внедряет Provider в конструктор. Означает ли это, что я могу/должен получить HttpSession, вызвав Provider.get() вместо того, чтобы позволить sitebricks вводить его в качестве параметра метода?

Похожие вопросы:

Обновления

  • Я удалил параметр HttpSession из всех методов сервлета, таких как bar. Я внедрил Provider<HttpSession> в сервлет и вызвал provider.get(), чтобы получить сеанс. Тесты, которые я провел до сих пор, показывают, что это более надежно, чем получение HttpSession из параметров. Тем не менее, я не уверен, предоставляется ли сеанс sitebricks или самим GAE. Предоставляется ли HttpSession контейнером сервлета?

person Ingo    schedule 18.09.2013    source источник


Ответы (1)


Обычно я сначала ввожу HttpServletRequest в класс обслуживания, а затем получаю объект HttpSession из запроса, который у меня хорошо работает.

Например:

@At("/preview")
@Service
public class PreviewService {

  @Inject
  private HttpServletRequest request;

  // It's similar if we need to modify response directly
  @Inject
  private HttpServletResponse response;

  @Get
  public Reply<?> get() {
    HttpSession session = request.getSession();
    ... ...
  }
}

Надеюсь, поможет.

person Jake W    schedule 13.04.2014