Вы можете иметь компонент без состояния, который можно использовать в качестве утилиты для управления таймерами в системе. Он будет отвечать за выполнение операций над ними - создавать / отменять таймеры.
Цель состоит в том, чтобы отделить операции таймера от класса запуска, а затем изменить их в определенный момент времени.
Но служебный бин должен быть инициализирован до EBlastScheduler
, который является стартовым бином, для этого вы должны аннотировать его аннотацией @DependsOn("TimerUtilityBean")
.
Ниже приведен пример кода, возможно, потребуется внести некоторые изменения.
EBlastScheduler.java
@Singleton
@Startup
@DependsOn("TimerUtilityBean")
public class EBlastScheduler {
@EJB
TimerUtilityBean timerBean;
@PostConstruct
public void initialize(){
timerBean.cancelTimer("EBlastScheduler");
timerBean.createTimer("*/1", "*", "*");
}
}
TimerUtilityBean.java
@Stateless
public class TimerUtilityBean {
@Resource
TimerService timerService;
public void createTimer(String sec, String min, String hour){
ScheduleExpression expression = new ScheduleExpression();
expression.second(sec).minute(min).hour(hour);
timerService.createCalendarTimer(expression);
}
public void cancelTimer(String timerInfo){
if (timerService.getTimers() != null) {
for (Timer timer : timerService.getTimers())
if (timer.getInfo().equals(timerInfo))
timer.cancel();
}
}
@Timeout
public void execute(Timer timer){
System.out.println("Invoked: " + System.currentTimeMillis());
}
public void reinitializeTimer(String sec, String min, String hour, String timerInfo){
cancelTimer(timerInfo);
createTimer(sec, min, hour);
}
}
Теперь вы можете использовать TimerUtilityBean
для управления таймерами из любого места в приложении. Может получить к нему удаленный доступ и сможет передавать новые параметры расписания.