我在EJB3.1 Timer服務中遇到問題。我覺得這個問題很奇怪!我在JBoss7.1.1應用服務器上部署了一個如下所示的無狀態會話bean。EJB3.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的Timer,如上所述。我部署了我的bean後,它工作正常。好的,我知道了,我不希望我的服務器控制檯混亂。所以,我註釋掉了timerService.createTimer(..)行代碼並重新部署。但是,我仍然看到正在打印的信息。好吧,我知道EJB定時器是持久的並且在服務器重新啓動後仍然存在。我可以停止定時服務的唯一方法是使用timer.cancel()方法,然後重新部署。但是,如何在不使用timer.cancel()的情況下停止或取消註冊我的Timer?
timer.cancel();多少時間;取消定時器?當我使用timer.cancel()並重新部署我的應用程序時,我可以看到「嘿!晚安!」在停止之前打印兩次,這意味着timer.cancel()耗時超過2000ms?
真的看起來像一個bug – Leo
也許,但任何方式來管理從容器管理控制檯或定時器? – IndoKnight
不確定。 ejb計時器規格充滿了缺失點。不知道JBoss,但爲了提醒我不得不使用石英函數繞過一些規範問題。 JBoss使用什麼作爲定時器實現?也許他們有一些專有的擴展。你可以配置定時器ejb使用jdbc後端? – Leo