java.util.Timer与EJB TimerBean

时间:2013-01-22 04:19:43

标签: java timer ejb

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

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

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

我也不确定我是否应该使用EJB Timer Bean。有人可以建议这两种方法的优缺点是什么?

2 个答案:

答案 0 :(得分:5)

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

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

首选EJB Timer Bean。

答案 1 :(得分:2)

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

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

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

在Java EE 6之前的几天中,Timers是持久的并且在容器重启后幸存下来(尽管不是应用程序重新部署)。现在,持久性是可选的,因此您需要注意这个细节。

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

但EJB计时器非常好,对Java EE 6更好。会使用EJB计时器,但我对它们感到满意,并且使用了难以使用的预处理器-Java EE 6有一段时间了。如果你在整个过程的EJB层中,我当然会使用它们。

相关问题