У меня есть следующий sitebricks сервлет. Foo.get()
доступен как GET
по адресу /foo/bar
. Я развернул сервлет на GAE.Как внедрить HttpSessions в области запросов в методах sitebricks в GAE?
@Service
@At("/foo")
@Singleton
public class Foo {
@Get
@At("/bar")
public Reply<?> bar(Request<String> request, HttpSession session) {
// access request scoped HttpSession
}
}
Если я понимаю правильно sitebricks, как запрос и HttpSession впрыскивают по sitebricks (возможно, с помощью Guice). Он также гарантирует, что HttpSession является локальным для текущего запроса. Параллельные запросы будут выполняться в том же экземпляре Foo
, поскольку класс аннотируется с @Singleton
(см. Guice docs). Но даже при одновременных запросах, поступающих на одну и ту же JVM, каждый вызов bar()
будет иметь собственную HttpSession на основе JSESSIONID, переданной клиентом. Имеются ли все эти предположения?
При выполнении нагрузочных тестов с моим приложением я заметил, что по очень низкой скорости HttpSession, переданная с помощью sitebricks/Guice, равна нулю. На данный момент я устраняю эту проблему с помощью Google. Но помимо GAE - что может вызвать это с точки зрения sitebricks/Guice?
I found a code snippet, который вводит поставщика в конструктор. Означает ли это, что я могу/должен получить HttpSession, вызвав Provider.get()
вместо того, чтобы позволить sitebricks вводить его как параметр метода?
Вопросы, относящиеся:
- Provider<HttpSession> not getting injected
- How to @Inject a HttpSession object in a service layer (DAO) class in GWT using Guice?
- Inject @SessionScoped value into filter with Guice
Обновления
- Я удалил параметр HttpSession из всех методов сервлета, таких как
bar
. Я ввелProvider<HttpSession>
в сервлет и позвонилprovider.get()
, чтобы получить сеанс. Тесты, которые я провел до сих пор, показывают, что это более надежное, чем получениеHttpSession
из параметров. Тем не менее, я не уверен, что сеанс предоставлен сайтом или GAE. Является ли HttpSession предоставленным контейнером сервлетов?