【问题标题】:Dispose session objects释放会话对象
【发布时间】:2012-10-08 21:31:02
【问题描述】:

是否可以在 struts2 中处理存储在会话中的对象?

我想在会话中存储的一些对象有需要释放的资源,但是当会话超时或关闭时,我找不到干净地处理它们的方法。

我意识到基于客户端的解决方案需要一个 javascript 计时器,但我现在并不担心客户端。我只是希望能够在会话超时时清理服务器端的资源。

我考虑过检查每个请求的会话(复数,因为可以有许多与不同客户端的并发会话)并执行后期清理,但此时会话映射已经消失。

【问题讨论】:

  • 会话是应用程序服务器的一个问题,所以没有实用的方法来处理会话,我不建议尝试这样做。我认为会话中应该存储的内容很少,足以在需要时从其他来源查找需要的内容。假设在会话中设置了一个用户对象,只需从会话映射中删除该对象,GC 就会处理它。
  • 我错过了清理方面。如果分配需要特别清理,那么会话肯定是错误的地方。你服务层是正确的地方,我认为你需要实现另一个计时系统,很多关于石英的好话。您将创建一个拦截器来重置该用户的计时器,当计时器到期时,您现在可以正确地进行清理。
  • 嗯...如果会话超时,会话就消失了。如果该会话中有对象,并且没有其他任何东西持有对该对象的引用,则这些对象已经符合 GC 条件,无需干预。还有会话监听器。我不明白你需要完成什么。
  • 顺便说一句,我建议从会话中删除需要特殊清理的对象,这些对象在会话超时时无法由自动 GC 处理。相反,为该对象存储一个标识符(没有附加的可以删除而没有任何副作用的字符串)
  • @Jensen Ching:我认为你在正确的轨道上。我会将状态/资源相关对象存储在其他地方,并将标识符放入会话中。我发现 HttpSessionListener 应该是我需要知道会话何时被销毁的钩子。在两者之间,我应该能够在会话消失时清理资源。谢谢!

标签: session struts2 server-side dispose


【解决方案1】:

从同事那里找到答案。感谢您的建议。

看来解决方案是创建一个实现 HttpSessionListener 的类。此接口包含在创建和销毁会话时调用的函数。然后添加:

<listener>
    <listener-class>my.package.listeners.TestSessionListener</listener-class>
</listener>

到 web.xml 或您的 servlet 配置文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多