2014-02-08 3 views
1

У меня проблема с сервисом таймера EJB3.1. Я нахожу этот вопрос довольно странным! У меня есть сессионный компонент без состояния, как показано ниже, на сервере приложений JBoss7.1.1.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, как указано выше. После того, как я развернул свой bean-компонент, он работает отлично. Хорошо, я понял, и я не хочу, чтобы моя консоль сервера загромождалась. Итак, я прокомментировал строку кода timerService.createTimer (..) и перераспределил ее. Но я все еще вижу, что сообщение печатается. Хорошо, я знаю, что таймеры EJB сохраняются и перезагружаются серверы. Единственный способ остановить службу Timer - использовать метод timer.cancel(), а затем повторно развернуть. Но как я могу остановить или отменить мой таймер из контейнера, не используя timer.cancel()?

Сколько времени таймер.cancel(); принять, чтобы отменить таймер? Когда я использую timer.cancel(), а затем перераспределяю свое приложение, я вижу «Эй, хорошая ночь!». печатается два раза перед остановкой, что означает, конечно, timer.cancel() занимает более 2000 мс?

+0

Действительно выглядит как ошибка – Leo

+0

Возможно, но любой способ управлять таймерами из консоли администратора контейнера или что-то в этом роде? – IndoKnight

+1

Не уверен. Спецификация таймера ejb заполнена недостающими точками. Не знаю JBoss, но для Tomee мне пришлось использовать функции кварца, чтобы обойти некоторые проблемы с spec. Что 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

Смежные вопросы