如何停止无尽的 EJB 3 计时器?
Posted
技术标签:
【中文标题】如何停止无尽的 EJB 3 计时器?【英文标题】:How to stop endless EJB 3 timer? 【发布时间】:2011-01-07 21:42:57 【问题描述】:我是 EJB 3 的新手。我使用以下代码启动无尽的 EJB 3 计时器 然后将其部署到 JBOSS 4.2.3
@Stateless
public class SimpleBean implements SimpleBeanRemote,TimerService
@Resource
TimerService timerService;
private Timer timer ;
@Timeout
public void timeout(Timer timer)
System.out.println("Hello EJB");
然后调用它
timer = timerService.createTimer(10, 5000, null);
效果很好。我创建了一个客户端类,该类调用一个创建计时器的方法和一个在计时器超时时调用的方法。
我忘记调用取消 然后它不会停止 .redeploy 并取消调用永远不会停止它。重启 Jboss 4.2.3 永远不要停止它。如何停止 EJB 计时器? 感谢您的帮助。
【问题讨论】:
【参考方案1】: public void stop(String timerName)
for(Object obj : timerService.getTimers())
Timer t = (Timer)obj;
if (t.getInfo().equals(timerName))
t.cancel();
【讨论】:
三年后,非常感谢 :) 这会取消所有计时器,但如果您咨询“getTimers()”,它们仍然存在:/ 不!这将只取消与timerName
同名的计时器。【参考方案2】:
您也可以取消部署您的应用程序,这将“杀死”所有计时器。
【讨论】:
如果计时器是持久的,则不太可能【参考方案3】:我的 JBoss AS 6.1 也遇到了同样的问题。 杀死这个无尽的(持久的)计时器后,我找到了以下解决方案来避免这种情况 未来的问题: 使用 JBoss AS 6.1 (EJB 3.1) 可以创建非持久性自动计时器,它们不会在服务器重新启动时存活:
@Schedule(minute=”*/10”, hour=”*”, persistent=false)
public void automaticTimeout ()
【讨论】:
【参考方案4】:另一种方法是使用“信息”属性创建自动计时器 (@Schedule),然后在计时器服务中检查具有相同信息的计时器,如果可用,请取消它:
@Schedule(hour="*", minute="*",second="3", persistent=false,info="AUTO_TIMER_0")
void automaticTimeOut()
if(timerCount==0)System.out.println("FROM AUTOMATIC TIME OUT -----------------> CALLED");timerCount++;
else
Iterator<Timer> timerIterator=timerService.getTimers().iterator();
Timer timerToCancel=null;
while(timerIterator.hasNext())
Timer tmpTimer=timerIterator.next();
if(tmpTimer.getInfo().equals("AUTO_TIMER_0"))timerToCancel=tmpTimer;break;
//while closing
if(timerToCancel!=null)
timerToCancel.cancel();
System.out.println("AUTOMATIC TIMER HAS BEEN CANCELED ----------------->>>>");
//if closing
//else closing
//automaticTimeOut closing
【讨论】:
【参考方案5】:在要关闭的 bean 中尝试 @PreDestroy
注释。
例如:
@PreDestroy
private void undeployTimer()
//..
一般来说资源的解除分配在这里完成。
【讨论】:
【参考方案6】:从 EJB 3.1 开始,TimerService
上有一些新方法,它们采用 TimerConfig
而不是 Serializable
有效负载。使用TimerConfig
允许使Timer
非持久化。
timerService.createIntervalTimer(10, 5000, new TimerConfig(null, false));
【讨论】:
以上是关于如何停止无尽的 EJB 3 计时器?的主要内容,如果未能解决你的问题,请参考以下文章