EJB - Service de minuterie

Le service de minuterie est un mécanisme par lequel une application planifiée peut être créée. Par exemple, la génération des fiches de salaire le 1er de chaque mois. La spécification EJB 3.0 a spécifié l'annotation @Timeout, qui aide à programmer le service EJB dans un bean sans état ou piloté par message. EJB Container appelle la méthode, qui est annotée par @Timeout.

Le service de minuterie EJB est un service fourni par le conteneur EJB, qui permet de créer une minuterie et de planifier un rappel lorsque la minuterie expire.

Étapes pour créer une minuterie

Injecter SessionContext dans le bean en utilisant l'annotation @Resource -

@Stateless
public class TimerSessionBean {

   @Resource
   private SessionContext context;
   ...
}

Utilisez l'objet SessionContext pour obtenir TimerService et pour créer un minuteur. Passez le temps en millisecondes et en message.

public void createTimer(long duration) {
   context.getTimerService().createTimer(duration, "Hello World!");
}

Étapes à suivre pour utiliser la minuterie

Utilisez l'annotation @Timeout pour une méthode. Le type de retour doit être void et passer un paramètre de type Timer. Nous annulons le minuteur après la première exécution, sinon il continuera à fonctionner après les intervalles de correction.

@Timeout
public void timeOutHandler(Timer timer) {
   System.out.println("timeoutHandler : " + timer.getInfo());        
   timer.cancel();
}

Exemple d'application

Créons une application de test EJB pour tester le service de minuterie dans EJB.

Étape La description
1

Créez un projet avec un nom EjbComponent sous un package com.tutorialspoint.timer comme expliqué dans le chapitre EJB - Créer une application .

2

Créez TimerSessionBean.java et TimerSessionBeanRemote comme expliqué dans le chapitre EJB - Créer une application . Gardez le reste des fichiers inchangé.

3

Nettoyez et créez l'application pour vous assurer que la logique métier fonctionne conformément aux exigences.

4

Enfin, déployez l'application sous forme de fichier jar sur JBoss Application Server. Le serveur d'applications JBoss démarrera automatiquement s'il n'est pas encore démarré.

5

Créez maintenant le client EJB, une application basée sur la console de la même manière que celle expliquée dans le chapitre EJB - Créer une application sous la rubriqueCreate Client to access EJB.

EJBComponent (module EJB)

TimerSessionBean.java

package com.tutorialspoint.timer;

import javax.annotation.Resource;
import javax.ejb.SessionContext;
import javax.ejb.Timer;
import javax.ejb.Stateless;
import javax.ejb.Timeout;

@Stateless
public class TimerSessionBean implements TimerSessionBeanRemote {

   @Resource
   private SessionContext context;

   public void createTimer(long duration) {
      context.getTimerService().createTimer(duration, "Hello World!");
   }

   @Timeout
   public void timeOutHandler(Timer timer) {
      System.out.println("timeoutHandler : " + timer.getInfo());        
      timer.cancel();
   }
}

TimerSessionBeanRemote.java

package com.tutorialspoint.timer;

import javax.ejb.Remote;

@Remote
public interface TimerSessionBeanRemote {
   public void createTimer(long milliseconds);
}
  • Dès que vous déployez le projet EjbComponent sur JBOSS, notez le journal jboss.

  • JBoss a créé automatiquement une entrée JNDI pour notre bean session - TimerSessionBean/remote.

  • Nous utiliserons cette chaîne de recherche pour obtenir un objet métier distant de type - com.tutorialspoint.timer.TimerSessionBeanRemote

Sortie du journal du serveur d'applications JBoss

...
16:30:01,401 INFO  [JndiSessionRegistrarBase] Binding the following Entries in Global JNDI:
   TimerSessionBean/remote - EJB3.x Default Remote Business Interface
   TimerSessionBean/remote-com.tutorialspoint.timer.TimerSessionBeanRemote - EJB3.x Remote Business Interface
16:30:02,723 INFO  [SessionSpecContainer] Starting jboss.j2ee:jar=EjbComponent.jar,name=TimerSessionBean,service=EJB3
16:30:02,723 INFO  [EJBContainer] STARTED EJB: com.tutorialspoint.timer.TimerSessionBeanRemote ejbName: TimerSessionBean
...

EJBTester (client EJB)

jndi.properties

java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=localhost
  • Ces propriétés sont utilisées pour initialiser l'objet InitialContext du service de nommage java.

  • L'objet InitialContext sera utilisé pour rechercher un bean session sans état.

EJBTester.java

package com.tutorialspoint.test;
   
import com.tutorialspoint.stateful.TimerSessionBeanRemote;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List;
import java.util.Properties;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class EJBTester {

   BufferedReader brConsoleReader = null; 
   Properties props;
   InitialContext ctx;
   {
      props = new Properties();
      try {
         props.load(new FileInputStream("jndi.properties"));
      } catch (IOException ex) {
         ex.printStackTrace();
      }
      try {
         ctx = new InitialContext(props);            
      } catch (NamingException ex) {
         ex.printStackTrace();
      }
      brConsoleReader = 
      new BufferedReader(new InputStreamReader(System.in));
   }
   
   public static void main(String[] args) {

      EJBTester ejbTester = new EJBTester();

      ejbTester.testTimerService();
   }
   
   private void showGUI() {
      System.out.println("**********************");
      System.out.println("Welcome to Book Store");
      System.out.println("**********************");
      System.out.print("Options \n1. Add Book\n2. Exit \nEnter Choice: ");
   }
   
   private void testTimerService() {
      try {
         TimerSessionBeanRemote timerServiceBean = (TimerSessionBeanRemote)ctx.lookup("TimerSessionBean/remote");

         System.out.println("["+(new Date()).toString()+ "]" + "timer created.");
         timerServiceBean.createTimer(2000);            

      } catch (NamingException ex) {
         ex.printStackTrace();
      }
   }
}

EJBTester effectue les tâches suivantes.

  • Chargez les propriétés de jndi.properties et initialisez l'objet InitialContext.

  • Dans la méthode testTimerService (), la recherche jndi est effectuée avec le nom - "TimerSessionBean / remote" pour obtenir l'objet métier distant (timer stateless EJB).

  • Ensuite, createTimer est appelé en passant 2000 millisecondes comme heure de planification.

  • EJB Container appelle la méthode timeoutHandler après 2 secondes.

Exécuter le client pour accéder à EJB

Recherchez EJBTester.java dans l'explorateur de projet. Faites un clic droit sur la classe EJBTester et sélectionnezrun file.

Vérifiez la sortie suivante dans la console Netbeans.

run:
[Wed Jun 19 11:35:47 IST 2013]timer created.
BUILD SUCCESSFUL (total time: 0 seconds)

Sortie du journal du serveur d'applications JBoss

Vous pouvez trouver les entrées de rappel suivantes dans le journal JBoss

...
11:35:49,555 INFO  [STDOUT] timeoutHandler : Hello World!
...