EJB3.1定时器取消问题(EJB3.1 Timer cancel issue)

2019-10-19 07:36发布

我有EJB3.1定时服务的问题。 我觉得这个问题很奇怪! 我有一个无状态会话bean像下面部署JBoss7.1.1应用服务器上。

import javax.annotation.Resource;
import javax.ejb.Local;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.ejb.Timeout;
import javax.ejb.Timer;
import javax.ejb.TimerService;
import javax.interceptor.Interceptors;

@Stateless
@Local(HelloUserLocal.class)
@Remote(HelloUserRemote.class)
public class HelloUserBean implements HelloUserRemote {

@Resource
private TimerService timerService;

@Interceptors({SayHelloMethodLoggingInterceptor.class})
public String sayHello(String name) {
    System.out.println("In sayHello(name)");
    String customName = "Hello " + name + " welcome to EJB 3 In Action!";
    System.out.println("Before returning, register Timer service");

    timerService.createTimer(10000, 2000, "Hey! Good Night!");

    return customName; 
}

@Timeout
public void activateTimer(Timer timer){
    System.out.println(timer.getInfo());
    //timer.cancel();
}   

}

我注册了如上initialDuration和intervalDuration一个定时器。 当我部署了我的豆,它工作正常。 好,我知道的东西,我不希望我的服务器控制台上的混乱。 所以,我注释掉timerService.createTimer(..)的代码行和重新部署。 但是,我仍然看到正在打印的消息。 好吧,我知道EJB计时器被持久化和生存服务器重新启动。 我能阻止我的定时服务的唯一方法是使用timer.cancel()方法,然后重新部署。 但是,我怎么能停止或从容器注销我的定时器不使用timer.cancel()?

多少时间timer.cancel(); 采取取消计时器? 当我使用timer.cancel(),然后重新部署我的应用程序,我可以看到“嘿!晚安!” 被印刷两次停止之前,这意味着当然timer.cancel()的时间比2000毫秒更?

Answer 1:

你可以使用@Schedule ,而不是与配置定时器persistent=false 。 如果持续计时器已经创建,貌似唯一的非程序化的方法来删除它是通过删除JBOSS_HOME/server/<servername>/data/timer-service-data ,我记得,在这不是很好的和在Jboss4天这可以通过JMX控制台来完成,但是因为这些天发生了很多变化,好运气。



文章来源: EJB3.1 Timer cancel issue