Timer automatico @ Pianificazione Java EE
Sono un nuovo utente di Java EE e sto sviluppando un'applicazione che deve aggiornare periodicamente il meteo. Ho creato un timer automatico utilizzando l'annotazione, al fine di aggiornare ogni 5 minuti. Vorrei passare al tempo dinamicamente (un amministratore può cambiarlo):
@Schedule(minute="*/5",hour = "*", persistent = false)
public void weatherUpdate(){
}
Avrei bisogno di una variabile intera chiamata frequency che contenga la frequenza degli aggiornamenti meteo. Ho provato a fare qualcosa del genere, ma questo non ha funzionato:
int freq=5;
@Schedule(minute="*/freq",hour = "*", persistent = false)
public void weatherUpdate(){
}
Conosci qualche soluzione?
1 answers
Una possibile soluzione è utilizzare un TimerService, ad esempio è possibile creare timer programmatici.
Ad Es.
@Singleton
@Startup
public class ProgrammaticTimer {
@Resource
TimerService timerService;
public void createTimer(String timerId, int frec){
ScheduleExpression expression = new ScheduleExpression();
expression.minute("*/"+freq).hour("*");
timerService.createCalendarTimer(expression, new TimerConfig(timerId, true));
}
@Timeout
public void execute(){
System.out.println("----Invoked: " + System.currentTimeMillis());
}
}
Per modificare una frequenza di un timer, per prima cosa è necessario annullare il timer corrente e creare un nuovo timer con il nuovo valore.
Ad Es.
@Singleton
@Startup
public class ProgrammaticTimer {
@Resource
TimerService timerService;
public void createTimer(String timerId, int freq){
ScheduleExpression expression = new ScheduleExpression();
expression.minute("*/"+freq).hour("*");
timerService.createCalendarTimer(expression, new TimerConfig(timerId, true));
}
public void editTimer(String timerId, int freq){
cancelTimer(timerId)
ScheduleExpression expression = new ScheduleExpression();
expression.minute("*/"+freq).hour("*");
timerService.createCalendarTimer(expression, new TimerConfig(timerId, true));
}
public void cancelTimer(String timerId) {
if (timerService.getTimers() != null) {
for (Timer timer : timerService.getTimers()) {
if (timer.getInfo().equals(timerId)) {
timer.cancel();
}
}
}
}
@Timeout
public void execute(){
System.out.println("----Invoked: " + System.currentTimeMillis());
}
}
Vedere anche: Utilizzo del servizio Timer
Spero che questo aiuto.