Как да инжектирам 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, е нула. В момента отстранявам този проблем с поддръжката на Google. Но освен GAE - Какво може да причини това от гледна точка на sitebricks/Guice?

Аз намерих кодов фрагмент, който инжектира доставчик в конструктора. Това означава ли, че мога/трябва да получа 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