【问题标题】:Use @predestroy method to execute pending instructions at session end?使用@predestroy 方法在会话结束时执行未决指令?
【发布时间】:2012-08-11 02:27:29
【问题描述】:

在会话范围的 bean 中的 Web 应用程序内的用户操作的上下文中存储待处理的执行列表是否安全,然后在会话结束时通过 @Predestroy 注释方法可靠地执行这些操作(我的意思是, @predestroy 方法的上下文中的安全性没有被调用,因此在某些情况下没有执行操作!?)。

【问题讨论】:

  • 当我按下提交按钮时,由于拼写错误导致我的标题被删除,所以瞬时错误标题是由于..
  • @Juan:看问题标签。
  • 我不确定您具体要问什么。但是对我来说,当服务器崩溃或被杀死时它们不会被执行是完全有意义的。这是你需要知道的吗?或者这不合逻辑?或者你有没有观察到完全不同的行为? 顺便问一下,你为什么偏爱这个问题?即使没有最喜欢的人,默认情况下您也会作为提问者收到任何新活动的通知。
  • 我不介意偶尔/很少/从前,该动作没有执行但通常不能容忍。
  • 赞成归零,因为这是一个关于实现有趣方面的公平问题,并且发布者按要求添加了标签

标签: jsf jsf-2 session-scope


【解决方案1】:

您可能希望考虑将您的逻辑移动到 HttpSessionListener 实现(它是一个接口)。您将触发 sessionDestroyed 事件(通过在您的具体实现中实现该方法)。

它非常简单易用,是处理这类事情的好地方(我在当前产品中实现了一个作为 JMX bean 来在运行时处理控制会话)。

TIA

【讨论】:

  • @Predestroy @SessionScoped 托管 bean 的注解方法位于 HttpSessionListener#sessionDestroyed() 已调用的 JSF 场景的后面。所以我完全看不出用本土实现来代替它是多么有用和“更安全”。
  • 并没有将其提供为“更安全”,只是使其具有语义针对性。是的,给这只猫剥皮的方法不止一种,但由于他对在会话销毁期间触发某些行为/方面特别感兴趣,因此将逻辑放在针对该行为的 bean 中可能更有意义。如果他的回调需要在“正常操作”期间不需要的其他 bean/资源,那么将它们注入以便它们在会话销毁时可用可能构成 bean 的污染。再次,不显示代码,它必须在摘要中权衡。
【解决方案2】:

在@preDestroy 方法中存储挂起的执行或数据库提交是完全安全的。在这种状态下,托管 bean 不会被销毁。因此托管 bean 的状态将与 bean 内部的普通方法调用相同。请参考以下文档。

http://docs.oracle.com/javaee/6/tutorial/doc/gmgkd.html#gmghg

"使用@PreDestroy 注解准备销毁托管bean 准备销毁托管 bean 指定生命周期回调方法,该方法表示应用程序组件即将被容器销毁。

在托管 bean 类或其任何超类中,准备销毁托管 bean。 在此方法中,在销毁 bean 之前执行所需的任何清理,例如释放 bean 一直持有的资源。

使用 javax.annotation.PreDestroy 注释对方法的声明进行注释。 CDI 在开始销毁 bean 之前调用此方法。”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-21
    • 2023-04-05
    • 1970-01-01
    • 2017-06-16
    • 2013-01-22
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    相关资源
    最近更新 更多