如何停止无尽的 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 计时器?的主要内容,如果未能解决你的问题,请参考以下文章

java ejb TimerService:getTimers返回的已取消计时器(树脂caucho)

WAR 版本更改后运行 EJB 持久计时器

EJB3 + JEE6:啥是持久定时器?

C# - 你如何停止计时器?

SwiftUI - 如何制作启动/停止计时器

如何停止在 C# 类中运行的计时器