2 votes

Planificateur de tâches Java EE utilisant les minuteries EJB

J'ai une exigence qui nécessite 3 à 6 tâches planifiées pour s'exécuter à un moment donné de la journée. Je suis totalement nouveau aux minuteries EJB, mais j'ai lu que les minuteries EJB sont le meilleur moyen de gérer les tâches planifiées dans un conteneur Java EE.

Question de conception :

Disons que j'ai besoin de 10 tâches planifiées. Je ne veux pas avoir, si possible, 10 minuteries EJB créées. Au lieu de cela, je voudrais avoir une seule minuterie EJB créée et ensuite réutiliser cela pour créer autant de tâches planifiées que nécessaire, en transmettant le temps planifié pour s'exécuter (comme arguments) pour chaque instance, est-ce possible ? Est-ce que quelqu'un peut aider avec un code squelette à ce sujet s'il vous plaît ?

N.B Je pense utiliser des minuteries EJB non persistantes...

9voto

Osw Points 1762

Une autre option (en plus de ce qui a déjà été dit) est d'utiliser un singleton avec l'annotation @Schedule pour chacune de vos méthodes programmées :

@Singleton
@Startup
public class TimedTaskManager {

  @Schedule(second = "0", minute = "*/5", hour = "*")
  public void runTask1() {
    //
  }

  @Schedule(second = "15", minute = "*/5", hour = "6,7,8")
  public void runTask2() {
    //
  }

  //
  //

  @Schedule(second = "0", minute = "*", hour = "1,2,6")
  public void runTaskN() {
    //
  }
}

2voto

MaDa Points 5571

Vous pourriez définir un minuterie dans l'une de vos méthodes métier de bean sans état/sans message (vous devriez tout de même l'appeler, ce n'est pas possible de créer une minuterie qui se déclencherait automatiquement). Ensuite, dans la méthode @Timeout, vous pourriez recréer la minuterie en fonction de la logique que vous jugez appropriée, par exemple:

@Stateless
public SomeEJB ... {

     @Resource
     private TimerService timerService;

     public void businessMethod() {
         timerService.createTimer(...);
     }

     @Timeout
     public void timeout(Timer timer) {
         // faire une certaine logique relative aux minuteries, recréer la minuterie,
         // peut-être avec une nouvelle durée
         timerService.createTimer(...);
     }
}

Cet exemple est compatible avec EJB 3.0.

1voto

SimonSez Points 1883

À ma connaissance, il n'est pas possible de créer un minuterie 'réutilisable' dans un EJB car vous devez indiquer à chaque minuterie la méthode qui doit être invoquée.

Regardez ceci :

La bibliothèque tierce Quartz Scheduler devrait être capable de créer des objets Minuterie de manière programmatique. Peut-être que cela vaut la peine de jeter un coup d'œil!

J'espère que cela vous a aidé, amusez-vous bien!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X