Ответ 1
public void stop(String timerName) {
for(Object obj : timerService.getTimers()) {
Timer t = (Timer)obj;
if (t.getInfo().equals(timerName)) {
t.cancel();
}
}
}
Я новичок в 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? Спасибо за помощь.
public void stop(String timerName) {
for(Object obj : timerService.getTimers()) {
Timer t = (Timer)obj;
if (t.getInfo().equals(timerName)) {
t.cancel();
}
}
}
У меня была та же проблема, с моим JBoss AS 6.1.
После убийства этих бесконечных (постоянных) таймеров я нашел следующее решение для ИЗБЕЖАНИЯ этого
проблема в будущем:
С JBoss AS 6.1 (EJB 3.1) можно создавать непостоянные автоматические таймеры, они НЕ ИСПРАВЛЯЮТ перезапуск сервера:
@Schedule(minute="*/10", hour="*", persistent=false)
public void automaticTimeout () {
Вы также можете развернуть свое приложение, это "убьет" все таймеры.
Другим методом является автоматический таймер (@Schedule) с атрибутом "info", а затем проверить службу таймера для таймеров с той же информацией и, если они доступны, отменить:
@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
Попробуйте аннотацию @PreDestroy
в bean, где вы хотите закрыть.
Например:
@PreDestroy
private void undeployTimer() {
//..
}
Как правило, выделение ресурсов выполняется здесь.
Так как EJB 3.1, на TimerService
есть новые методы, которые вместо Serializable
принимают TimerConfig
. Использование TimerConfig
позволяет сделать Timer
неустойчивым.
timerService.createIntervalTimer(10, 5000, new TimerConfig(null, false));