Minuterie automatique @ Planifier Java EE
Je suis un nouvel utilisateur de Java EE et je développe une application qui doit mettre à jour la météo périodiquement. J'ai créé une minuterie automatique en utilisant l'annotation, afin de mettre à jour toutes les 5 minutes. Je voudrais passer à l'heure dinamically (un administrateur peut le changer):
@Schedule(minute="*/5",hour = "*", persistent = false)
public void weatherUpdate(){
}
J'aurais besoin d'une variable entière appelée frequency qui contient la fréquence des mises à jour météorologiques. J'ai essayé de faire quelque chose comme ça, mais cela n'a pas fonctionné:
int freq=5;
@Schedule(minute="*/freq",hour = "*", persistent = false)
public void weatherUpdate(){
}
Connaissez-vous une solution?
1 answers
Une solution possible est d'utiliser un TimerService, par exemple, vous pouvez créer programmatique des chronomètres.
Par exemple.
@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());
}
}
Pour modifier la fréquence d'une minuterie, vous devez d'abord annuler la minuterie actuelle et créer une nouvelle minuterie avec la nouvelle valeur.
Par exemple.
@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());
}
}
Voir aussi: Utilisation du service de minuterie
J'espère que cette aide.