web-dev-qa-db-fra.com

Annotation @Schedule exécutée toutes les quelques minutes (ou secondes)

Je voudrais essayer d'utiliser l'annotation @Schedule de la manière suivante:

public class MyTestServlet extends HttpServlet {
    private static JcanLogger LOG = JcanLoggerFactory.getLogger(ServiceTestServlet.class);

    @EJB CronService cronService;

    public void service(HttpServletRequest req, HttpServletResponse resp) throws .... {
    ....
    cronService.iLive(); 
}
---
    @Local // because the ejb is in a servlet (there is no other jvm)
public interface CronService {

    public void iLive();
    public void runsEveryMinute();
}
---
@Singleton
public class CronServiceBean implements CronService {
    private static final JcanLogger LOG = JcanLoggerFactory.getLogger(CronServiceBean.class);

    @Schedule(minute="*")
    public void runsEveryMinute() {
        LOG.info(" runs EveryMinute ");
    }

    public void iLive() {
        LOG.info("iLive");

    }
 ---
 LOG
 ... 
 CronServiceBean:34  ] iLive

Sur la base du journal, le CronService fonctionne bien, mais la tâche planifiée "runsEveryMinute" ne fonctionne pas.

Comment cela devrait-il fonctionner en utilisant une tâche planifiée EJB?

25
cscsaba

Selon le Javadoc pour le @Schedule annotation, les valeurs par défaut sont:

  • * pour tous les champs sauf l'heure, la minute et la seconde; et
  • 0 pour les heures, les minutes et les secondes, par défaut.

En spécifiant minute="*" et laissant l'heure à sa valeur par défaut de 0, il demande que le minuteur s'exécute toutes les minutes après minuit pendant une heure (c.-à-d. 00:00, 00:01, 00:02, ..., 00:59), puis ne recommence pas avant le lendemain. Utilisez plutôt:

@Schedule(hour="*", minute="*")

Pour exécuter toutes les quelques secondes (par exemple, 10 secondes), vous pouvez utiliser une syntaxe semblable à cron :

@Schedule(hour = "*", minute = "*", second = "*/10", persistent = false)

Par défaut, le planificateur conserve les événements. Réglage persistent = false les empêchera de s'accumuler avec le temps, si vous le souhaitez.

70
Brett Kail

Veuillez trouver les détails suivants pour la configuration du planificateur.

(1) Pour exécuter toutes les 1 min

@Schedule(hour = "*", minute = "*/1", persistent = false)

(2) Pour exécuter toutes les 5 minutes

@Schedule(hour = "*", minute = "*/5", persistent = false)

(3) Pour exécuter toutes les 30 secondes

@Schedule(hour = "*", minute = "*", second = "*/30", persistent = false)

(4) Pour courir tous les jours à 6h00

@Schedule(hour = "6", minute = "0", second = "0", persistent = false)

(5) Pour fonctionner tous les vendredis à 14h00

@Schedule(dayOfWeek = "Fri", hour = "14", persistent = false)

(6) Pour courir le premier jour de chaque mois à 5h00

@Schedule(dayOfMonth="1", hour = "5", persistent = false)

J'espère que ces informations vous aideront à configurer le planificateur selon vos besoins.

6
Radadiya Nikunj