EJB3.1计时器取消问题

时间:2014-02-08 20:57:10

标签: java-ee timer jboss7.x java-ee-6 ejb-3.1

我有EJB3.1定时服务的问题。我发现这个问题很奇怪!我在JBoss7.1.1应用服务器上部署了一个无状态会话bean,如下所示。

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的Timer。在我部署了bean之后,它运行正常。好的,我得到了这个东西,我不希望我的服务器控制台杂乱无章。所以,我注释掉了timerService.createTimer(..)代码行并重新部署。但是,我仍然看到正在打印的消息。好的,我知道EJB计时器是持久存在的,并且在服务器重启后仍然存在。我可以停止定时服务的唯一方法是使用timer.cancel()方法然后重新部署。但是,如何在不使用timer.cancel()的情况下从容器中停止或取消注册Timer?

timer.cancel()多少时间;拿取定时器?当我使用timer.cancel()然后重新部署我的应用程序时,我可以看到“嘿!晚安!”在停止之前打印两次,这意味着timer.cancel()肯定需要超过2000毫秒?

1 个答案:

答案 0 :(得分:3)

您可以改用@Schedule并使用persistent=false配置您的计时器。如果已经创建了持久性计时器,看起来像删除它的唯一非编程方式是删除JBOSS_HOME/server/<servername>/data/timer-service-data,这不是很好,而且我记得,在JBoss4天,这可以通过JMX控制台完成,但那些日子以来发生了很多变化,祝你好运。