Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.

Java ee - chapitre 4 couche métier - 5 jms et mdb

127 vues

Publié le

cours java ee - chapitre 4 couche métier - 5 jms et mdb
Vous pouvez télécharger les codes complet des exemples à partir de mon compte google drive. L'adresse est précisée dans le document.
- Présentation
- JMS : Java Message Service
- JMS : les interfaces
- Destinations
- Les messages
- Les objets administrés
- Accès aux objets « administrés »
- Envoyer/recevoir les messages
- Message-driven bean
- Le cycle de vie d’un MDB

Publié dans : Formation
  • Soyez le premier à commenter

Java ee - chapitre 4 couche métier - 5 jms et mdb

  1. 1. Professeur : Christophe Fessard Développement d’applications distribuées en java ee Chapitre - Couche métier JMS et MDB Important Dans le présent document vous trouverez des références à des exemples de code sous la forme « Démo – NomDuProjet ». Les projets ont été écrit sous l’IDE eclipse java EE neon version 4.6.0 Vous pouvez les télécharger à partir de mon compte google drive avec l’adresse suivante : https://drive.google.com/file/d/16SamwnmZtlkqTNJW-tuGPHo6jY_PZusJ/view?usp=sharing
  2. 2. 2 Présentation  Modèle Client-Serveur  communication synchrone Inconvénients : connexion permanente des 2 parties  non robuste aux pannes du serveur (fiabilité)  limite les liaisons 1 client vers 1 serveur (pas de broadcasting).  Le client attend la fin de traitement du serveur (performance)  Alternative : messagerie inter-application  communication asynchrone  Les messages sont envoyés quand la connexion est ouverte.  JMS (Java Message Service) = interface Java standard pour les MOM  Files d’attentes (queues) pour le mode requête / réponse  Sujets (topics) pour le mode publication / abonnement  EJB Message = composant invoqué par messages (écouteur)  Reçoit les messages postés dans une file / sujet  Poste des messages dans la file / sujet
  3. 3. 3 JMS - Java Message Service  API d'échanges de messages, permet un dialogue asynchrone entre applications via un fournisseur ou MOM (Middleware-Oriented Messages).  L’application cliente envoie un message dans une file d’attente (découplage logiciel), sans se soucier de la disponibilité de cette application.  Le client a, de la part du fournisseur de messages, une garantie de qualité de service (certitude de remise au destinataire, délai de remise, etc.). Exemple d’utilisation : Le mail d’internet  Un émetteur envoie un message à un destinataire,  Le récepteur reçoit ce message (sans action particulière),  Les messages sont persistants L’API JMS, contenue dans le paquetage javax.jms , définit plusieurs entités :  Un fournisseur (provider) : implémente l’API JMS, stocke les messages et les envoie aux consommateurs  Un client : classe Java qui utilise JMS pour émettre et/ou recevoir des messages via le fournisseur.  Un message : données échangées de manière asynchrone entre les composants (texte, objet, binaire, etc.).  Les objets administrés : ressources à rechercher dans l’annuaire JNDI du provider, fabriques de connexions et destinations. Les listes de diffusion, logiciels de causerie, (« chat »)  Abonnement d’un « client » à une liste de diffusion  Un des « clients » décide de poster un message,  Tous les abonnés reçoivent ce message,
  4. 4. 4 JMS : les interfaces ConnectionFactory - ensemble de paramètres de configuration de connexion (défini par l’administrateur). Connection - connexion active d'un client à son fournisseur JMS. Session createSession(false, AUTO_ACKNOWLEDGE) : Pas de transaction et accusé de réception automatique. void start() : Démarre (ou redémarre) la transmission des messages. Session - thread unique qui produit et consomme des messages Destination - encapsule une adresse spécifique au fournisseur. L'API JMS ne définit pas de syntaxe d'adresse standard. Dépend du middleware orienté message (MOM). MessageConsumer – permet de recevoir des messages à partir d'une destination. MessageProducer – permet d’envoyer des messages à une destination.
  5. 5. 5 Destinations Deux modes d’envoi des messages :  Le mode point à point (Queue),  les messages sont consommés par un seul récepteur,  utilise des files d’attente (javax.jms.Queue) pour communiquer.  Le mode publication/abonnement Publish/Subscribe (Topic)  utilise des sujets ( javax.jms.Topic ) pour échanger des messages.  Les messages peuvent être reçus par plusieurs récepteurs.  Conserver les messages pour les récepteurs déconnectés  ils doivent avoir été déclarés comme durables. Démo - 3JMSPublishSubsribeQueue (Mettre en évidence les différences Topic/Queue)
  6. 6. 6 Les messages En JMS, ces messages doivent implémenter l’interface javax.jms.Message et sont composés de trois parties :  l’en-tête (header), qui comporte des caractéristiques techniques (identifiant, date d’envoi, etc.), sont affectées automatiquement par le provider  les propriétés (properties), qui représentent les caractéristiques fonctionnelles du message ;  le corps du message (body), qui contient les données à transporter. Les données (du corps) sont formatées selon le type du message qui est défini par les interfaces suivantes : Interface Description javax.jms.BytesMessage Pour les messages binaires (images, vidéos, documents électroniques...). javax.jms.TextMessage Échange de données de type texte (XML par exemple). javax.jms.ObjectMessage Messages composés d’objets Java sérialisés. javax.jms.MapMessage Échange de données sous la forme clé/valeur. La clé doit être une String et la valeur de type primitif. javax.jms.StreamMessage Échange de données en provenance d’un flux. Lors de la réception d’un message, celui-ci est toujours de type javax.jms.Message . Exemple de transtypage d’un message public void onMessage(Message message) { if (message instanceof TextMessage) { TextMessage texteMessage = (TextMessage) message; System.out.println("Reception du message : "+texteMessage.getText()); } }
  7. 7. 7 Les objets administrés  Objets créés et configurés, sur le serveur d’application via une console ou par script d’administration.  Les rechercher par leur nom dans l’annuaire JNDI ou utiliser l’injection. Dans l’utilisation de l’API JMS, deux types d’objets sont « administrés » :  Les fabriques de connexions (ConnectionFactory) permettent d’obtenir une connexion auprès d’un provider.  Les destinations sont les objets qui « aiguillent » les messages. Deux types : Queue et Topic . Extrait du fichier standalone-full-ha.xml – fabrique de connection par défaut dans wildfly Créer la destination, exemple : <connection-factory name="RemoteConnectionFactory"> <connectors> <connector-ref connector-name="http-connector"/> </connectors> <entries> <entry name="java:jboss/exported/jms/RemoteConnectionFactory"/> </entries> <ha>true</ha> <block-on-acknowledge>true</block-on-acknowledge> <reconnect-attempts>-1</reconnect-attempts> </connection-factory>
  8. 8. 8 Accès aux objets « administrés » Par injection @Resource - Injecter tout objet déclaré dans JNDI (référencer une DataSource, un pool de connexions JDBC, des destinations ou fabrique de connexions JMS). Par création du contexte JNDI Les propriétés pour la création du contexte JNDI sont dépendantes du fournisseur utilisé. Nous pouvons renseigner ces propriétés programmatiquement ou grâce à un fichier de configuration. Exemple serveur wildfly 8 : @Stateless public class EjbSatatelessSendMessage implements InterfaceLocal, InterfaceRemote { @Resource(mappedName = "java:jboss/exported/jms/RemoteConnectionFactory") private ConnectionFactory connectionFactory; @Resource(mappedName = "java:jboss/exported/jms/queue/mdbQueue") private Destination destinationOrder; // … } Properties p = new Properties(); p.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory"); p.put(Context.PROVIDER_URL, "http-remoting://localhost:8080"); p.put(Context.SECURITY_PRINCIPAL, "userame"); p.put(Context.SECURITY_CREDENTIALS, "passwd"); Contexte ctx = new InitialContext(p); Destination destination = (Topic)ctx.lookup("topic/testTopic1"); ConnectionFactory factory=(ConnectionFactory) ctx.lookup("jms/RemoteConnectionFactory"); Démo - 1EjbStatelessSendMessage/1EjbSingletonReceptMessage Démo - 3JMSPublishSubsribeQueue
  9. 9. 9 Envoyer/recevoir les messages Connection conn = factory.createConnection("login","passwd"); Session session = conn.createSession(false, JMSContext.AUTO_ACKNOWLEDGE); MessageProducer producer = session.createProducer(destination); conn.start(); TextMessage texteMessage = session.createTextMessage(); texteMessage.setText("Message envoyée"); producer.send(texteMessage); session.close(); conn.close(); Connection conn = factory.createConnection("login","passwd"); Session session = conn.createSession(false, JMSContext.AUTO_ACKNOWLEDGE); MessageConsumer consumer = session.createConsumer(destination); consumer.setMessageListener(this); @Override public void onMessage(Message message) { try { if (message instanceof TextMessage) { TextMessage texteMessage = (TextMessage) message; System.out.println(((TextMessage)message).getText()); } } catch (JMSException e) { e.printStackTrace(); } }
  10. 10. 10 Message-driven bean Composant spécifique permettant de recevoir en mode asynchrone des messages S’exécutent à l’intérieur d’un conteneur qui assure le multithreading, la sécurité ou la gestion des transactions. Implémente javax.jms.MessageListener, calback onMessage (Message m), appelée au moment de la réception Créer un composant Message-driven Bean : New > Message-Driven Bean (EJB 3.x)
  11. 11. 11 Exemple @javax.ejb.MessageDriven - permet de préciser qu'un EJB est de type Message-driven bean.  String mappedName - Nom sous lequel l'EJB sera mappé.  ActivationConfigProperty[] activationConfig - Préciser les informations de configuration @javax.ejb.ActivationConfigProperty - précise Les paramètres nécessaires à la configuration de l'EJB  Notamment le type et la destination sur laquelle le bean doit écouter @MessageDriven( activationConfig = { @ActivationConfigProperty( propertyName = "destination", propertyValue = "testTopic1"), @ActivationConfigProperty( propertyName = "destinationType", propertyValue = "javax.jms.Topic") }, mappedName = "testTopic1") public class MdbTopic implements MessageListener { public MdbTopic() {} public void onMessage(Message message) { if (message instanceof TextMessage) { TextMessage texteMessage = (TextMessage) message; try { System.out.println("Topic - Reception du message : "+texteMessage.getText()); } catch (JMSException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } Démo - 2MessageDrivenBeanRecepteur
  12. 12. 12 Le cycle de vie d’un MDB Le cycle de vie d’un message-driven bean est identique à celui d’un stateless bean. Remarque : MDB stockés dans un pool - Bien que les spécifications n’obligent pas les conteneurs à avoir un pool de message- driven beans, la plupart des serveurs d’applications en utilise un pour augmenter les performances.

×