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?

Author: Arjan Tijms, 2015-01-07

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.

 0
Author: Federico Sierra, 2015-01-07 17:38:22