2014-02-08 21 views
1

我在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?

+0

真的看起來像一個bug – Leo

+0

也許,但任何方式來管理從容器管理控制檯或定時器? – IndoKnight

+1

不確定。 ejb計時器規格充滿了缺失點。不知道JBoss,但爲了提醒我不得不使用石英函數繞過一些規範問題。 JBoss使用什麼作爲定時器實現?也許他們有一些專有的擴展。你可以配置定時器ejb使用jdbc後端? – Leo

回答

3

您可以改爲使用@Schedule,並使用persistent=false配置您的計時器。如果已經創建了一個持久化定時器,看起來像刪除它的唯一非編程方式就是刪除JBOSS_HOME/server/<servername>/data/timer-service-data,這並不好,我記得,在JBoss4時代,這可以通過JMX控制檯完成,但很多自那些日子以來改變了,祝你好運。

+0

您可以使用任何管理控制檯管理您的EJB3.1計劃嗎? – IndoKnight

+1

在jBoss7中,我不這麼認爲,但是通過'persistent = false',重啓後它們會消失 – Camilo