Apache Camel avec IBM MQ

Bonjour, a-t-on déjà utilisé Camel avec la MQ d’IBM. Nous envisageons éventuellement d’utiliser les deux produits ensemble, mais nous n’avons aucun exemple de collaboration entre les deux produits.

Le meilleur que j’ai pu obtenir est documenté ci-dessous, illustré par un contexte d’application XML Spring qui héberge lui-même le contexte et les routes CAMEL. Cet exemple fonctionne avec l’adaptateur de ressources natif compatible MQ JCA IBM v7.5, CAMEL 2.16, Spring core 4.2. Je l’ai déployé sur les serveurs Glassfish, Weblogic et JBoss EAP7.

La complexité est liée au traitement des rapports MQ dont la philosophie est en conflit avec celle d’un message de réponse JMS simple. Pour une explication détaillée, reportez-vous à la section Implémentation du composant WebSphere MQ avec CoD sur Camel JMS natif

Cet exemple basé sur CAMEL XML DSL est autonome et facile à tester.

Nous commençons par les déclarations Spring & CAMEL:

  

Le contexte CAMEL suit avec 2 itinéraires: MQ à JMS et JMS à MQ, enchaînés ici pour former un pont facilitant les tests.

   

Bizarre: sur Weblogic, la seule façon d’obtenir (par exemple) 3 écouteurs est d’imposer 3 connexions (avec 3 Camel: à partir d’instructions en séquence) avec 1 session maximum, sinon une erreur MQ se produit: MQJCA1018: Une seule session par connexion permis. Sur JBoss, vous pouvez simplement ajuster concurrentConsumers = …

   

L’option disable disableReplyTo ci-dessus garantit que CAMEL ne produira pas de réponse avant que nous puissions tester le type de message MQ à 1 = Request (-reply) ou 8 = datagramme (one way!). Ce test et cette construction de réponse ne sont pas illustrés ici.

Ensuite, nous imposons l’EIP à InOnly lors de la publication suivante au format JMS simple pour être cohérent avec le mode MQ entrant.

      

Ceci termine la route MQ-to-jms; vient ensuite la route jms-to-MQ toujours dans le même contexte CAMEL:

       

Vient ensuite l’indicateur de demande pour que le rapport MQ CoD soit renvoyé par la destination distante. Nous imposons également que le message MQ soit de type Datagramme (valeur 8).

  2048 64 8 

La queue ReplyTo peut être spécifiée soit via l’option URI ReplyTo, soit sous la forme d’un en-tête comme ci-dessous.

Ensuite, nous utilisons l’en-tête CamelJmsDestinationName pour appliquer la suppression de l’en-tête de message MQRFH2 de JMS MQ (en utilisant la valeur d’option 1 de l’URL MQ targetClient). En d’autres termes, nous voulons envoyer un message binary MQ vanilla (c’est-à-dire uniquement le descripteur de message MQMD suivi de la charge utile).

  TEST.REPLYTOQ  queue://MYQMGR/TEST.Q2?targetClient=1 

Plus de champs MQMD peuvent être contrôlés via les propriétés JMS réservées, comme illustré ci-dessous. Voir les ressortingctions dans IBM doc.

  MQSTR  _PLACEHOLDER_24_CHARS_ID_ 

La queue de destination de l’URI est remplacée par CamelJmsDestinationName ci-dessus. Le nom de la queue dans l’URI devient donc un espace réservé.

L’option URI preserveMessageQos est celle qui – comme observé – permet d’envoyer un message avec les données ReplyTo en cours de définition (pour obtenir le rapport MQ CoD), mais empêche CAMEL d’instancier un écouteur de réponse en appliquant le MEP InOnly.

     

Nous n’avons pas terminé, nous devons encore déclarer nos fabriques de files d’attente à la fois pour un fournisseur JMS natif et Websphere MQ (via l’adaptateur de ressources natif IBM WMQ JCA), afin de les adapter à votre contexte. Nous utilisons ici les recherches JNDI sur les objects administratifs.

            

Une alternative à l’extraction des usines (et des adaptateurs JCA) à partir de JNDI consiste à déclarer le client JMS en tant que beans Spring. Dans Weblogic et Glassfish, vous serez mieux inspiré en déployant l’adaptateur de ressources IBM JCA natif et en créant des ressources JNDI référencées dans le contexte Spring comme ci-dessus. Dans JBoss, une déclaration de bean client MQ directe convient mieux que ci-dessous.

               

Commentaires et améliorations sont les bienvenus.

J’ai beaucoup recours à IBM MQ avec camel. Il n’y a pas de problème à utiliser les deux ensemble. Je vais coller un exemple de configuration à partir de l’un de mes fichiers de contexte Spring en utilisant un JMC Endpoint, une fabrique de connexions Spring et une définition IBM MQ.

Route des chameaux

 from("someplace") .to("cpaibmmq:queue:myQueueName"); 

Contexte du spring