【问题标题】:java.util.Timer vs EJB TimerBean [duplicate]java.util.Timer vs EJB TimerBean [重复]
【发布时间】:2013-01-05 06:26:05
【问题描述】:

我必须为以下场景实现一个简单的计时器任务 -

method1(){  
.....  
   if(success){  
      trigger method2 for next 30 min every 15 sec  
   }  
}

我已经使用 java.util.Timer 和 java.util.TimerTask 实现了这段代码,并且工作正常。但是,我的代码最终将作为 web 服务部署在 glassfish 服务器中。所以我想知道它是否会由于 glassfish 容器而产生任何问题,因为我通过 Timer 间接使用线程。

我也不确定是否应该使用 EJB Timer Bean。有人可以请教一下这两种方法的优缺点吗?

【问题讨论】:

    标签: java timer ejb


    【解决方案1】:

    与大多数 EJB 一样,这两种技术的最大区别在于事务。定时器 EJB 就是 EJB,所以每次调用都是一个唯一的事务,容器将为您管理所有这些细节。

    线程,尤其是从 EJB 中创建的线程,将具有未确定的事务状态。大多数容器将很多上下文与当前执行的线程相关联,尤其是事务状态,这是(其中之一)自制线程在 EJB 容器中是一个坏主意的原因之一——容器上下文信息可能会丢失或损坏。

    对于 EJB 计时器,您可以轻松创建一个每 15 秒触发一次的计时器,但您需要跟踪并在 30 分钟后手动取消它。您可以使用 ScheduleExpression 来表达“每 15 秒为 30m”规则,但您仍然需要在最后取消计时器(坦率地说,正确创建该表达式会做更多的工作)。在 Timers Info 中添加一个开始时间会更容易,告诉它何时开始,然后它可以在最后一次运行时自行终止。

    在 Java EE 6 之前的日子里,定时器是持久的,并且在容器重新启动时仍然存在(尽管不是应用程序重新部署)。现在,持久性是可选的,因此您需要注意该细节。

    如果要从 Web 层(而不是 EJB 层)触发此方法,则放宽线程限制,或者您可以使用 Quartz Timer。

    但是 EJB 计时器非常好,并且更适合 Java EE 6。会使用 EJB 计时器,但我对它们很满意,并且使用过更难使用的 pre -Java EE 6 一段时间。如果您在整个过程中处于 EJB 层,我当然会使用它们。

    【讨论】:

      【解决方案2】:

      EJB 规范警告用户编码(或第三方编码)线程。

      企业 bean 不得尝试管理线程。企业 bean 不得尝试启动、停止、暂停或恢复线程,或者更改线程的优先级或名称。企业 bean 不得尝试管理线程组。21.2.2 编程限制,EJB 3.1 规范)

      EJB Timer Bean 是首选。

      【讨论】:

      • 对于复杂的需求,Quartz 也是首选。
      猜你喜欢
      • 2010-11-12
      • 2015-05-18
      • 1970-01-01
      • 1970-01-01
      • 2011-01-02
      • 2012-01-14
      • 1970-01-01
      • 1970-01-01
      • 2011-02-07
      相关资源
      最近更新 更多