EJB - Beans pilotés par message

Un bean géré par message est un type de bean entreprise, qui est appelé par le conteneur EJB lorsqu'il reçoit un message d'une file d'attente ou d'une rubrique. Le bean géré par message est un bean sans état et est utilisé pour effectuer une tâche de manière asynchrone.

Pour démontrer l'utilisation du bean piloté par message, nous utiliserons le chapitre de persistance EJB et nous devons effectuer les tâches suivantes -

  • Step 1- Créer une table dans la base de données (voir le chapitre EJB-Persistence ).

  • Step 2- Créer la classe Entity correspondant à la table (voir le chapitre EJB-Persistence ).

  • Step 3- Créer une DataSource et une unité de persistance (reportez - vous au chapitre EJB-Persistence ).

  • Step 4- Créez un EJB sans état ayant une instance EntityManager (reportez - vous au chapitre EJB-Persistence ).

  • Step 5- Mettez à jour les méthodes ejb.Add sans état pour ajouter des enregistrements et obtenir des enregistrements de la base de données via le gestionnaire d'entités (reportez - vous au chapitre EJB-Persistence ).

  • Step 6 - Créez une file d'attente nommée BookQueue dans JBoss default répertoire des applications.

  • Step 7 - Un client d'application basé sur la console enverra un message à cette file d'attente.

  • Step 8 - Créez un bean géré par message, qui utilisera le bean sans état pour conserver les données client.

  • Step 9 - Le conteneur EJB de jboss appellera le bean piloté par message ci-dessus et lui transmettra le message auquel le client enverra.

Créer une file d'attente

Créez un fichier nommé jbossmq-destinations-service.xml s'il n'existe pas dans <JBoss Installation Folder> > server > default > deploy dossier.

Ici, nous créons une file d'attente nommée BookQueue -

jbossmq-destinations-service.xml

<mbean code="org.jboss.mq.server.jmx.Queue"  
   name="jboss.mq.destination:service=Queue,name=BookQueue">  
   <depends optional-attribute-name="DestinationManager">
      jboss.mq:service=DestinationManager
   </depends>  
</mbean>

Lorsque vous démarrez le JBoss, vous verrez une entrée similaire dans le journal jboss.

...
10:37:06,167 INFO  [QueueService] Queue[/queue/BookQueue] started, fullSize=200000, pageSize=2000, downCacheSize=2000
...

Créer un bean piloté par message

@MessageDriven(
   name = "BookMessageHandler",
   activationConfig = {
      @ActivationConfigProperty( propertyName = "destinationType", 
                                 propertyValue = "javax.jms.Queue"),
      @ActivationConfigProperty( propertyName = "destination", 
                                 propertyValue ="/queue/BookQueue")
   }
)
public class LibraryMessageBean implements MessageListener {
 
   @Resource
   private MessageDrivenContext mdctx;  
 
   @EJB
   LibraryPersistentBeanRemote libraryBean;
 
   public LibraryMessageBean() {        
   }
 
   public void onMessage(Message message) {
   }
}
  • LibraryMessageBean est annoté avec l'annotation @MessageDriven pour le marquer comme bean géré par message.

  • Ses propriétés sont définies comme destinationType - Queue et destination - / queue / BookQueue.

  • Il implémente l'interface MessageListener, qui expose la méthode onMessage.

  • Il a MessgeDrivenContext comme ressource.

  • Le bean sans état LibraryPersistentBeanRemote est injecté dans ce bean à des fins de persistance.

Construisez le projet EjbComponent et déployez-le sur JBoss. Après avoir créé et déployé le module EJB, nous avons besoin d'un client pour envoyer un message à la file d'attente jboss.

Exemple d'application

Créons une application EJB de test pour tester Message Driven Bean.

Étape La description
1

Créez un projet avec un nom EjbComponent sous un package com.tutorialspoint.entity comme expliqué dans le chapitre EJB - Créer une application . Vous pouvez également utiliser le projet créé dans le chapitre EJB - Créer une application en tant que tel pour ce chapitre pour comprendre les concepts de persistance des EJB.

2

Créez Book.java sous le package com.tutorialspoint.entity tel que créé dans le chapitre EJB-Persistence .

3

Créez LibraryPersistentBean.java et LibraryPersistentBeanRemote comme créé dans le chapitre EJB-Persistence .

4

Créez jboss-ds.xml dansEjbComponent > setup dossier et persistence.xml dansEjbComponent > src > conf dossier. Ces dossiers peuvent être vus dans l'onglet Fichiers de Netbeans tel que créé dans le chapitre EJB-Persistence .

5

Créez LibraryMessageBean.java sous un package com.tutorialspoint.messagebean et modifiez-le comme indiqué ci-dessous.

6

Créez la file d'attente BookQueue dans Jboss comme décrit ci-dessus.

sept

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

8

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é.

9

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. Modifiez-le comme indiqué ci-dessous.

EJBComponent (module EJB)

LibraryMessageBean.java

package com.tutorialspoint.messagebean;
 
import com.tutorialspoint.entity.Book;
import com.tutorialspoint.stateless.LibraryPersistentBeanRemote;
import javax.annotation.Resource;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.EJB;
import javax.ejb.MessageDriven;
import javax.ejb.MessageDrivenContext;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.ObjectMessage;
 
@MessageDriven(
   name = "BookMessageHandler",
   activationConfig = {
      @ActivationConfigProperty( propertyName = "destinationType", 
                                 propertyValue = "javax.jms.Queue"),
      @ActivationConfigProperty( propertyName = "destination", 
                                 propertyValue ="/queue/BookQueue")
   }
)
public class LibraryMessageBean implements MessageListener {
 
   @Resource
   private MessageDrivenContext mdctx;  
 
   @EJB
   LibraryPersistentBeanRemote libraryBean;
 
   public LibraryMessageBean() {        
   }
 
   public void onMessage(Message message) {
      ObjectMessage objectMessage = null;
      try {
         objectMessage = (ObjectMessage) message;
         Book book = (Book) objectMessage.getObject(); 
         libraryBean.addBook(book);
 
      } catch (JMSException ex) {
         mdctx.setRollbackOnly();
      }       
   }   
}

EJBTester (client EJB)

EJBTester.java

package com.tutorialspoint.test;
   
import com.tutorialspoint.entity.Book;
import com.tutorialspoint.stateless.LibraryPersistentBeanRemote;
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.jms.ObjectMessage;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
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.testMessageBeanEjb();
   }
   
   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 testMessageBeanEjb() {
 
      try {
         int choice = 1; 
         Queue queue = (Queue) ctx.lookup("/queue/BookQueue");
         QueueConnectionFactory factory =
         (QueueConnectionFactory) ctx.lookup("ConnectionFactory");
         QueueConnection connection =  factory.createQueueConnection();
         QueueSession session = 
         connection.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
         QueueSender sender = session.createSender(queue);
 
         while (choice != 2) {
            String bookName;
            showGUI();
            String strChoice = brConsoleReader.readLine();
            choice = Integer.parseInt(strChoice);
            if (choice == 1) {
               System.out.print("Enter book name: ");
               bookName = brConsoleReader.readLine();
               Book book = new Book();
               book.setName(bookName);
               ObjectMessage objectMessage = 
                  session.createObjectMessage(book);
               sender.send(objectMessage); 
            } else if (choice == 2) {
               break;
            }
         }
 
         LibraryPersistentBeanRemote libraryBean = 
         (LibraryPersistentBeanRemote)
         ctx.lookup("LibraryPersistentBean/remote");
 
         List<Book> booksList = libraryBean.getBooks();
 
         System.out.println("Book(s) entered so far: " + booksList.size());
         int i = 0;
         for (Book book:booksList) {
            System.out.println((i+1)+". " + book.getName());
            i++;
         }           
      } catch (Exception e) {
         System.out.println(e.getMessage());
         e.printStackTrace();
      }finally {
         try {
            if(brConsoleReader !=null) {
               brConsoleReader.close();
            }
         } catch (IOException ex) {
            System.out.println(ex.getMessage());
         }
      }
   }   
}

EJBTester effectue les tâches suivantes -

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

  • Dans la méthode testStatefulEjb (), la recherche jndi est effectuée avec le nom - "/ queue / BookQueue" pour obtenir la référence de la file d'attente disponible dans Jboss. Ensuite, l'expéditeur est créé à l'aide de la session de file d'attente.

  • Ensuite, l'utilisateur voit une interface utilisateur de magasin de bibliothèque et il / elle est invité à entrer un choix.

  • Si l'utilisateur entre 1, le système demande le nom du livre et l'expéditeur envoie le nom du livre dans la file d'attente. Lorsque le conteneur JBoss reçoit ce message dans la file d'attente, il appelle la méthode onMessage de notre bean géré par message. Notre bean piloté par message enregistre ensuite le livre en utilisant la méthode addBook () du bean session avec état. Session Bean persiste le livre dans la base de données via un appel EntityManager.

  • Si l'utilisateur entre 2, une autre recherche jndi est effectuée avec le nom - "LibraryStatefulSessionBean / remote" pour obtenir à nouveau l'objet métier distant (EJB avec état) et la liste des livres est effectuée.

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:
**********************
Welcome to Book Store
**********************
Options 
1. Add Book
2. Exit 
Enter Choice: 1
Enter book name: Learn EJB
**********************
Welcome to Book Store
**********************
Options 
1. Add Book
2. Exit 
Enter Choice: 2
Book(s) entered so far: 2
1. learn java
1. learn EJB
BUILD SUCCESSFUL (total time: 15 seconds)

La sortie montrée ci-dessus indique que notre bean piloté par message reçoit le message et stocke le livre dans un stockage persistant et les livres sont extraits de la base de données.