3

我有以下sitebricks servlet。Foo.get()可作为GETat访问/foo/bar。我将 servlet 部署到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。所有这些假设都有效吗?

在对我的应用程序运行负载测试时,我注意到 sitebricks/Guice 传入的 HttpSession 以非常低的速率为空。我目前正在 Google 的支持下解决此问题。但除了 GAE - 从 sitebricks/Guice 的角度来看,什么可能导致这种情况?

我找到了一个将 Provider 注入构造函数的代码片段。这是否意味着我可以/应该通过调用Provider.get()而不是让 sitebricks 将其作为方法参数注入来获取 HttpSession?

相关问题:

更新

  • 我从所有 servlet 方法中删除了 HttpSession 参数,例如bar. 我将 aProvider<HttpSession>注入 servlet 并调用provider.get()以获取会话。到目前为止,我运行的测试表明这比HttpSession脱离参数更可靠。也就是说,我不确定会话是由 sitebricks 还是 GAE 本身提供的。HttpSession是servlet容器提供的吗?
4

1 回答 1

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();
    ... ...
  }
}

希望能帮助到你。

于 2014-04-13T02:21:57.853 回答