Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.util.Timer与EJB TimerBean_Java_Timer_Ejb - Fatal编程技术网

java.util.Timer与EJB TimerBean

java.util.Timer与EJB TimerBean,java,timer,ejb,Java,Timer,Ejb,我必须为以下场景实现一个简单的计时器任务- method1(){ ..... if(success){ trigger method2 for next 30 min every 15 sec } } 我已经使用java.util.Timer和java.util.TimerTask实现了这段代码,并且工作正常。然而,我的代码最终将作为web服务部署在glassfish服务器中。所以我想知道它是否会因为glassfish容器而产生任何问题,因为我通过计

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

method1(){  
.....  
   if(success){  
      trigger method2 for next 30 min every 15 sec  
   }  
}
我已经使用java.util.Timer和java.util.TimerTask实现了这段代码,并且工作正常。然而,我的代码最终将作为web服务部署在glassfish服务器中。所以我想知道它是否会因为glassfish容器而产生任何问题,因为我通过计时器间接使用线程


我也不确定是否应该使用EJB定时器Bean。有人能告诉我这两种方法的优缺点吗?

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

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


EJB定时器Bean是首选。

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

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

对于EJB计时器,您可以很容易地创建一个每隔15秒触发一次的计时器,但是您需要跟踪并在30分钟后手动取消它。您可以使用ScheduleExpression来表示“每隔15秒30米”规则,但最后仍然需要取消计时器(坦率地说,正确创建该表达式需要更多的工作)。只需在计时器信息中输入一个开始时间,告诉它什么时候开始,然后它就可以在最后一次运行时终止

在JavaEE6之前的日子里,计时器是持久的,并且在容器重新启动(尽管不是应用程序重新部署)后幸存下来。现在,持久性是可选的,所以您需要注意这个细节

如果此方法是从Web层(而不是EJB层)触发的,线程限制将被放松,或者您可以使用Quartz计时器


但是EJB计时器非常好,而且对于JavaEE6更好。我会使用EJB定时器,但我对它们很满意,并且已经使用了一些较难使用的JavaEE6之前的定时器。如果您在整个过程中使用EJB层,我肯定会使用它们。

对于复杂的需求,石英也是首选。