Blue Flower

Chercher

Utilser un EJB Entity avec deux MDBs pour regrouper des messages

L'application utilise les composants suivants:

  • Une application cliente qui à la fois envoie et reçoit des messages
  • Deux MDB (Message-Driven Beans)
  • Une classe entity (EJB entity)

Présentation de l'application exemple clientmdbentity
Cette application va simuler le processus d'embauche dans une entreprise; elle  montre une possibilité d'utilisation des EJB Entity avec les MDB. On est dans le cas où un système de messagerie client  doit attendre l'arrivée  de plusieurs messages avant de les traiter; il assemble tous ces messages et les traite en une seule fois. Cette technique appelée "pattern joining messages"  n'est pas spécifique à JMS; on s'en sert aussi pour des opérations transactionnelles. Ici on a un ensemble de messages qui seront traités simultanément par un MDB.
un MDB traite un seul message à la fois lors d'une transaction; ici l'application se sert de MDB pour envoyer des messages qui sont stockés temporairement en se servant de EJB Entity; le bean Entity  détermina ensuite si toutes les informations requises sont arrivées, les réunit sous forme d'un message unique, le réexpédie à un autre MDB  qui se chargera d'envoyer ce message stocké via l'EJB Entity de  la Destination vers HR Client. Une fois que le message est traité l'EJB Entity est détruit par l'application. L'image ci-dessous illustre le comportement de l'application.

 Client to Message-Driven Beans to Entity
Client de Messag-Driven Bean à EJB Entity
  1. Un composant de l’application génère un ID pour chaque employé embauché et publie dans un Topic un message M1 contenant cet ID, le nom de l'employé et sa position dans la société; ce Message est consommé par deux MDBs, OfficeMDB et EquipmentMDB; entre temps l'application crée une file d'attente de messages temporaire (ReplyQueue) qui va attendre l'arrivée de la réponse de (M1).

  2. Chaque message est traité par deux MDBs, le MDB OfficeMDB et le MDB EquipmentMDB. Le MDB  OfficeMDB assigne à l'employé un bureau et le MDB EquipmentMDB lui assigne tout l'équipement nécessaire. Le premier MDB pour rendre persistante son information va créer un EJB Entity appelé SetupOffice, et le deuxième MDB va faire appel à cet Entity nouvellement créé pour y ajouter l'information qu' il traite.

  3. Quand les deux MDBs ont fini de traiter le message (M1), le "business method" de l'EJB Entity SetupOffice retourne une valeur "true"  au MDB qui l'a appelé (EquipmentMDB); ce MDB  EquipmentMDB envoie un message (M2) à la file de message Temporaire et ensuite détruit l'instance de l'EJB Entity.


Les composants de l'application  clientmdbentity

Les composants de l'application cliente clientmdbentity sont les message-driven beans et la classe EJB Entity .

L' application Cliente HumanResourceClient.java
L'application cliente  HumanResourceClient.java exécute les étapes suivantes:

  1. Elle définit un Topic pour l'application en utilisant le namespace java:app car ce Topic est utilisé par l'application Client et le module EJB
  2. L'application client injecte les ressources  ConnectionFactory et Topicresources
  3. Elle crée une file d'attente de message temporaire  TemporaryQueue pour recevoir la notification des actions en cours
  4. Elle Crée une instance de  JMSConsumer pour  TemporaryQueue, modifie le "message listener" de JMSConsumer et démarre la connexion
  5. Elle crée un MapMessage
  6. Elle crée 5 nouveaux noms d'employés (avec chacun sa position et son ID) de façon aléatoire; elle publie cela sous forme de 5 messages

Le "message Lstener" HRListener est en attente (à l'écoute) des messages qui précise pour chaque employé son bureau et ses affaires; quand un message arrive  le "message Lstener" affiche l'information reçue et détermine si tous 5 les messages sont arrivés.. Si c'est le cas le "message Listener" à la méthode main  que les messages son bien  là.

Codage des Message-Driven Beans de clientmdbentity
Cet exemple utilise deux message-driven Beans:

  • EquipmentMDB.java
  • OfficeMDB.java

Les beans passent par les étapes suivantes:

  1. Ils injectent une ressource  MessageDrivenContext, un EntityManager, et un  JMSContext.
  2. La méthode onMessage récupère le message . La méthode onMessage de  EquipmentMDB choisit l'équipement qu'il faut en se référant  de la position du nouveau employé, la méthode onMessage de OfficeMDB génère aléatoirement le numéro de bureau
  3. Après un court instant , la méthode onMessage appelle la méthode compose
  4. La méthode compose passe par les étapes suivantes:
    1. Ellle crée et rend persistants l'information via l'Entity SetupOffice  ou la trouve en se servant de la clé primaire
    2. Elle utilise l' Entity pour sauvegarder dans la base de données l'information concernant l' équipement le bureau, puis appelle les deux "business methods"  doEquipmentList et  doOfficeNumber.
    3. Si le "business method" retourne "true" cela veut dir que l'information est sauvegardée, et q'une réponse fut retournée.
    4. Elle détruit ensuite l'instance de l'Entity SetupOffice.

Codage de la classe EJB Entity  de clientmdbentity
La classe EJB entity est déclarée comme suit:

@Entity
public class SetupOffice implements Serializable {

La classe contient un constructeur sans argument et un constructeur qui a deux arguments, l'ID de l'employé, le nom de l'employé, le numéro du bureau et la liste de ses équipements de bureau. La méthode getter de l' ID possède l'annotation @Id pour indiquer qu'on est en présence de la clé primaire.

@Id
public String getEmployeeId() {
    return id;
}

La classe implémente aussi deux "business method"  doEquipmentList  et doOfficeNumber et une méthode utilitaire checkIfSetupComplete.

Le message-Driven Bean appelle les "business methods" et méthodes getter

Le fichier persistence.xml de l'EJB Entity :

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" 
             xmlns="http://xmlns.jcp.org/xml/ns/persistence" 
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence 
               http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
  <persistence-unit name="clientmdbentity-ejbPU" transaction-type="JTA">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <jta-data-source>java:comp/DefaultDataSource</jta-data-source>
    <properties>
      <property name="eclipselink.ddl-generation" 
                value="drop-and-create-tables"/>
    </properties>
  </persistence-unit>
</persistence>

précédent suivant