10
votes

Comment démarrer une minuterie EJB sur le déploiement?

J'ai besoin de créer une minuterie d'intervalle qui est définie pour exécuter une fois par semaine automatiquement. Je ne veux pas qu'il démarre en fonction de la saisie de l'utilisateur, mais je souhaite que cela soit créé lorsque l'application est déployée sur le serveur. Chaque exemple que j'ai vu a une autre classe commençant la minuterie. Je ne veux pas utiliser un bean piloté de message pour créer la minuterie car l'audit doit simplement interroger une base de données pour une période donnée et ne repose pas des actions qui envoient des messages.

J'ai inclus un exemple de minuterie . Dans l'exemple ci-dessous, la minuterie devrait tirer toutes les 10 minutes. En tant que test, je veux la minuterie à feu toutes les 10 minutes afin que je puisse tester la minuterie. P>

@Stateless
public class TimerTest implements
        TimerTestLocal, TimerTestRemote{

    @Resource 
    private TimerService timerService;
    private Logger log = Logger.getLogger(TimerTest.class);
    private long interval = 1000 * 60 * 10;
    private static String TIMER_NAME = "AuditTimer";

    public void scheduleTimer() throws NamingException {
        // TODO Auto-generated method stub
        Calendar cal = Calendar.getInstance();
        //cal.set(Calendar.HOUR_OF_DAY, 23);//run at 11pm
        //cal.set(Calendar.MINUTE, 00);
        //cal.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY);
        SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy hh:mm");
        log.debug("schedule for: " + sdf.format(cal.getTime()));

        timerService.createTimer(cal.getTime(), interval, TIMER_NAME);
    }

    public void cancelTimer() {
        for(Object obj : timerService.getTimers())
        {
            Timer timer = (Timer)obj;
            if(timer.getInfo().equals(TIMER_NAME))
                timer.cancel();
        }
    }

    @Timeout
    public void timerEvent(Timer timer) {
        log.debug("timer fired");
    }


}


0 commentaires

3 Réponses :


16
votes

La manière dont j'ai effectué des minuteries dans le passé consiste à créer un auditeur de contexte dans le web.xml pour configurer la minuterie.

De cette façon, vous pouvez vous assurer qu'il est démarré avec le conteneur et fermez proprement lorsque l'application est déclenchée.


0 commentaires

1
votes

Je ne sais pas si l'utilisation du contextlistener pour démarrer la minuterie peut fonctionner. De cet article, Comment Pour utiliser EJB 3 TIMER dans un cluster de Weblogic 10 , on dirait que vous pouvez rencontrer quelques problèmes dans Weblogic 10.3.2.


1 commentaires

J'ai trouvé le même problème à JBoss EAP 5.1. L'EJB n'est pas accessible au moment où l'auditeur de contexte est invoqué.



25
votes

Si votre projet peut utiliser JEE6 / EJB3.1, il y a une solution bien meilleure à ce problème. http://docs.oracle.com/javaee/6/TUCTIAL/doc /bnboy.html xxx

à l'aide de la nouvelle annotation @schedule, vous avez un contrôle étendu à propos de quand et à quelle fréquence une méthode temporelle sera appelée. La grande hausse: vous n'avez plus besoin de démarrer la minuterie "de l'extérieur".

Oracle écrit:

Les minuteries automatiques sont créées par le conteneur EJB lorsqu'une entreprise haricot contenant des méthodes annotées avec le @schedule ou @schedules Les annotations sont déployées. Un haricot d'entreprise peut avoir plusieurs méthodes de délai d'attente automatiques, contrairement à une minuterie programmatique, qui permet une seule méthode annotée avec l'annotation @timeout dans le Classe de haricots Enterprise.


1 commentaires

Pour répondre à votre autre question