2013-09-18 3 views
3

У меня есть следующий 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 вводить его как параметр метода?

Вопросы, относящиеся:

Обновления

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

ответ

0

Обычно я вставляю 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(); 
    ... ... 
    } 
} 

Надеется, что это помогает.