Le Touilleur ExpressLe Touilleur ExpressLe Touilleur ExpressLe Touilleur Express
  • Accueil
  • A propos de l’auteur
  • A propos du Touilleur Express

Java Message Service JMS

    Home Java Java Message Service JMS

    Java Message Service JMS

    Par Nicolas Martignole | Java | Commentaires fermés | 3 juin, 2005 | 0 | 1 394 affichages
         

    Aaah les transactions et JMS. Cela fait longtemps que j’avais envie de remettre le nez dans les spécifications de JMS. 5 mn sur Google et je trouve un bon article sur JMS API(Java? Message Service Application Programming Interface) qui présente en quelques pages le principe de JMS. JMS est une API Java destinée à l’échange de messages asynchrones entre application. JMS propose ce que JDBC a réussi à faire pour les bases de données: établir un standard pour l’échange de messages en Java. Cette API repose sur la présence d’un serveur qui répond à la définition JMS et qui joue le tiers de confiance entre l’application qui émet un message et l’application qui consomme ce message. Ceci permet de fournir des services à valeur ajoutée comme la gestion des transactions, la qualité de service et la sécurité.
    L’article complet sur le site de Core Developers Network vaut le coup d’être lu car si vous ne connaissez pas JMS, vous en aurez ensuite un bon aperçu.

    Je connaissais déjà le système des Queues et des Topics et je me demandais quel serait l’interêt des transactions avec JMS. Les Topics et les Queues permettent d’envoyer des messages en étant certain que le client en face l’a lu complétement. C’est le système d’acquitement. Donc pourquoi des transactions ? Voici quelques élements de réponses: les transactions JMS permettent à un client d’envoyer plusieurs messages JMS à différent destinataire et d’annuler (rollback) la transaction si l’un des destinataires provoque une exception. Prenons le cas suivant: une application doit envoyer un bon de commande à un entrepôt et doit envoyer un avis de facturation à la comptabilité. Cependant si le bon de commande n’arrive pas à l’entrepôt, nous ne voulons pas que la compta soit activée. Et inversement ! C’est là que JMS propose une solution simple pour résoudre facilement ce genre de situation: lorsque de la création de la session, il suffit de spécifier que celle-ci requiert un contexte transactionnel.

    
    	// pour une connexion point à point:
    	ses = connection.createQueueSession(true, Session.AUTO_ACKNOWLEDGE);
    
    	// pour une connexion de type Topc (publish-subscribe)
    	ses = connection.createTopicSession(true, Session.AUTO_ACKNOWLEDGE);
    
    

    Le fait de forcer un contexte transactionel va évidemment ralentir le traitement du message. Mais à mon avis le coup sur les performances est minime par rapport au service que JMS offre ici. Evidemment nous pouvons recoder tout ce système mais sommes-nous certain de pouvoir faire mieux ? combien de temps pour le faire ? pour le maintenir ?
    Pour revenir aux transactions et JMS il faut juste noter quelques détails (traduction en français de l’article de CoreDevelopers):

    • les messages envoyés à une destination ne sont pas délivrés à celle-ci tant que la session côté client n’est pas commité. Si la session est annulé, aucun message n’est envoyé aux clients.
    • les messages reçus sur une destination ne seront pas acquités tant que la session n’aura pas été commitée.
    • N’importe quel travail en cours sera annulé lorsque la session sera fermée. Si votre application plante, n’importe quelle transaction qui n’a pas été commitée est alors annulé.

    Si nous reprenons notre problème d’entrepôt et de service comptabilité, voici comment Je reprends un exemple de code qui est dans l’article de Core Developers Network pour expliquer le principe des transactions:

    (code adapté de l'article sur Core Developer Networks)
    
          InitialContext ctx;
          QueueConnectionFactory cf;
          QueueConnection connection;
          QueueSession session;
          Queue destination;
          QueueSender sender;
          TextMessage message1,message2;
    
          ctx = new InitialContext();
          cf = (QueueConnectionFactory)ctx.lookup("ConnectionFactory");
          destination = (Queue)ctx.lookup("queue/testQueue");
    
          connection = cf.createQueueConnection();
    	  // Creation d'une session avec transaction
          session = connection.createQueueSession(true, Session.AUTO_ACKNOWLEDGE);
          sender = session.createSender(destination);
          message1 = session.createTextMessage();
          message1.setText("Test customer order");
    
          message2 = session.createTextMessage();
          message2.setText("End of customer order");
    
          System.out.println("Sending Message.");
    
          try{
                 sender.send(message1);
                 sender.send(message2);
                 session.commit();
          }catch (Throwable e){
                 session.rollback();
          }
          System.out.println("Done.");
          connection.close();
    
    
    

    Simple, efficace et souple. Un autre exemple sur le site de SUN permet aussi de voir l’intérêt des transactions. Voici le schéma de principe de l’application:

    Bref voilà un système qui permet de se passer de moteur de règles ou tout du moins d’en limiter la complexité. A noter que JBoss avec JBossMQ offre un serveur JMS gratuit et open-source. Pour en savoir plus c’est par là.

    Articles similaires:

    Default ThumbnailFaut-il développer une API Web pour votre service ? Default ThumbnailService perturbé Default ThumbnailService s = new ServiceImpl() : pourquoi faites-vous cela ? Default ThumbnailMock JavaMail
    Java, jms

    Recent Posts

    • GitHub Actions : le tueur de Jenkins ?

      Avouez-le : ce titre de blog est super racoleur. J’avais aussi pensé

      15 février, 2021
    • Comment recréer du lien social dans l’Entreprise avec des outils numériques en 2021

      Nous sommes en février 2021 pendant le 3ème confinement lié à la

      10 février, 2021
    • FizzBuzz en Java et Scala (surtout Scala)

      L’exercice FizzBuzz est un petit exercice très simple, à tester par exemple

      9 février, 2021

    Recent Tweets

    • RT  @QuarkusIO : We just released Quarkus https://t.co/ZkyLrP5cFs. The big change is the Fast jar packaging as default (better read the annou…

      10 hours ago
    •  @starbuxman  Très bonne idée 👍🏻

      11 hours ago
    •  @jylls35  Merci je ne savais pas 😀

      1 day ago
    • RT  @benzonico :  @nmartignole  Dans la même veine de dictons : "Il n'y a pas de bons montagnards, il y a des vieux montagnards..."

      1 day ago
    • «... un pilote vieux c’est un pilote chanceux et prudent... » (fin du tweet précédent)

      2 days ago

    Mots clés

    agile (18) ajax (11) Apple (11) architecture (6) barcamp (5) BarCampJavaParis (5) ddd (5) devoxx (33) esb (6) exo (6) flex (9) geek (5) google (11) grails (5) groovy (10) humeur (12) humour (7) independant (6) iphone (12) Java (77) javascript (7) jazoon (28) jboss (22) jboss seam (12) jsf (9) jug (16) Linux (11) mac (6) mule (5) parisjug (7) paris jug (22) pjug (6) play (8) playframework (6) portlet (5) recrutement (6) ria (8) Scala (21) scrum (44) spring (23) Startup (11) usi (21) usi2010 (9) web (16) xebia (7)

    Le Touilleur Express

    Contactez-moi : nicolas@touilleur-express.fr

    Suivez-moi sur Twitter : @nmartignole

    Copyright© 2008 - 2020 Nicolas Martignole | Tous droits réservés
    • A propos de l’auteur
    • A propos du Touilleur Express
    Le Touilleur Express