Traitement des en-têtes de message IBM MQ

Les messages IBM MQ peuvent éventuellement contenir des en-têtes supplémentaires ou des en-têtes qui remplacent l'en-tête MQRFH2 qui contient les propriétés JMS. Les programmes d'application WebSphere Application Server peuvent utiliser les classes com.ibm.mq.headers pour accéder aux en-têtes de classe dans les messages de IBM MQ et créer des en-têtes dans les messages à IBM MQ.

En-têtes de messate IBM MQ

Les messages IBM MQ contiennent toujours un descripteur de message (MQMD). Ils peuvent également contenir des en-têtes qui contiennent des informations supplémentaires sur les messages. Par exemple, les messages destinés aux ou provenant des applications JMS contiennent généralement un en-tête MQRFH2 qui contient les propriétés des messages. IBM MQ définit le format et l'utilisation de certains en-têtes (tels que MQRFH2) et permet aux utilisateurs et aux fournisseurs de logiciels tiers de définir leurs propres en-têtes personnalisés.

Généralement, les programmes d'application n'ont pas à traiter les en-têtes des messages IBM MQ. La plupart des applications IBM MQ n'utilisent pas d'en-tête du tout ou uniquement l'en-tête MQRFH2 et l'intégration de services et les fournisseurs de messagerie IBM MQ traitent automatiquement l'en-tête MQRFH2 lorsque vous communiquez avec ces applications. Toutefois si vous communiquez avec une application IBM MQ qui utilise ou crée des en-têtes additionnels ou différents, l'application WebSphere Application Server peut utiliser les classes com.ibm.mq.headers pour créer les en-têtes dans les messages qu'il envoie et les traiter dans les messages qu'il reçoit.

Dans le message IBM MQ, les en-têtes (s'il en existe) se trouvent au début du message avant la charge du message. Chaque en-tête contient des champs qui décrivent l'en-tête suivant ou la charge s'il n'y a plus d'en-têtes. Le MQMD contient les champs décrivant le premier en-tête ou la charge s'il n'y a plus d'en-tête. Le MQMD et l'en-tête MQRFH2 n'apparaissent généralement pas dans un message JMS. Lorsque le fournisseur de messagerie convertit un message IBM MQ en message JMS, il utilise les informations du MQMD et de l'en-tête MQRFH2 pour définir les champs et les propriétés des en-têtes JMS. De même, lorsque le fournisseur de messagerie convertit un message JMS en message IBM MQ, il utilise les champs et les propriétés d'en-têtes JMS pour créer le MQMD et l'en-tête MQRFH2.

Le fournisseur JMS gère les autres en-têtes dans les messages IBM MQ en convertissant le message IBM MQ en BytesMessage ou depuis un BytesMessage ; les en-têtes apparaissent au début du corps du message, suivis de la charge du message IBM MQ (éventuellement). La propriété JMS_IBM_Format du message JMS indique le format des données dans le corps du message (le premier en-tête en l'occurrence) et les propriétés JMS_IBM_Encoding et JMS_IBM_Character_Set indiquent son codage et son CCSID.

Traitement des en-têtes de message IBM MQ dans un BytesMessage JMS

Le package com.ibm.mq.headers contient des classes et des interfaces que vous pouvez utiliser pour analyser et manipuler les en-têtes IBM MQ dans le corps d'un BytesMessage JMS. L'interface MQHeader fournit des méthodes générales pour accéder aux champs d'en-tête et pour lire et écrire le contenu du message. Chaque type d'en-tête dispose de sa propre classe qui implémente l'interface MQHeader et ajoute des méthodes getter et setter pour des champs individuels. Par exemple, la classe MQCIH représente le type d'en-tête MQCIH (CICS Bridge). Les classes d'en-tête exécutent automatiquement la conversion de données nécessaires et peuvent lire ou écrire les données dans un codage numérique ou un jeu de caractères défini (CCSID).

Deux classes auxiliaires, MQHeaderIterator and MQHeaderList, permettent de lire et de décoder (analyse) le contenu des en-têtes dans les messages :
  • MQHeaderIterator fonctionne comme java.util.Iterator. Tant qu'il existe des en-têtes dans le message, la méthode next() retourne true et la méthode nextHeader() ou next() retourne l'objet en-tête suivant.
  • MQHeaderList fonctionne comme java.util.List. A l'instar de MQHeaderIterator, il analyse le contenu des en-têtes, mais il permet également de rechercher des en-têtes particuliers et d'ajouter de nouveaux en-têtes, de supprimer les en-têtes existantes, de mettre à jour les champs des en-têtes et d'écrire le contenu des en-têtes dans un message. Vous pouvez également créer une liste MQHeaderList vide et la remplir avec des instances d'en-tête et l'écrire dans un message une seule fois ou de manière répétée.

Chaque classe d'en-têtes implémente l'interface MQHeader qui fournit les méthodes int read (java.io.DataInput message, int encoding, int characterSet) et int write (java.io.DataOutput message, int encoding, int characterSet). Les classes java.io.DataInputStream et java.io.DataOutputStream implémentent respectivement DataInput et DataOutput. Vous pouvez obtenir les objets DataInput et DataOutput depuis les octets transportés dans les messages JMS, comme dans l'exemple suivant qui traite un seul en-tête MQCIH :

import java.io.*;
import javax.jms.*;
import com.ibm.mq.headers.*;
...
BytesMessage bytesMessage = (BytesMessage) msg; // Message received from JMS consumer
byte[] bytes = new byte [(int) bytesMessage.getBodyLength ()];
bytesMessage.readBytes (bytes);
DataInput in = new DataInputStream (new ByteArrayInputStream (bytes));
MQCIH cih = new MQCIH (in, 
   bytesMessage.getIntProperty("JMS_IBM_Encoding"), 
   819); 

Vous pouvez également utiliser la classe MQHeaderIterator pour traiter une séquence d'en-tête en remplaçant la ligne qui commence par MQCIH cih = new MQCIH par :

MQHeaderIterator it = new MQHeaderIterator (in, 
   bytesMessage.getStringProperty("JMS_IBM_Format"), 
   bytesMessage.getIntProperty("JMS_IBM_Encoding"), 
   819);
while (it.hasNext()) {
   MQHeader item = (MQHeader) it.next();
   ...
}

Cet exemple crée un seul en-tête (de type MQCIH) et l'ajoute à un BytesMessage :

import java.io.*;
import javax.jms.*;
import com.ibm.mq.constants.CMQC;
import com.ibm.mq.headers.*;
...
MQCIH header = new MQCIH();
ByteArrayOutputStream out = new ByteArrayOutputStream ();

header.write (new DataOutputStream (out), CMQC.MQENC_NATIVE, 819);
byte[] bytes = out.toByteArray ();
BytesMessage newMsg = origSes.createBytesMessage();
newMsg.writeBytes(bytes);

This example uses the MQHeaderList class to add two headers into a BytesMessage:

import java.io.*;
import javax.jms.*;
import com.ibm.mq.constants.CMQC;
import com.ibm.mq.headers.*;
...
byte[] outheaders = null;
byte[] outbody = ...
try {
    MQHeaderList it = new MQHeaderList ();
    MQHeader header1 = ... // Could be any header type
    MQHeader header2 = ... // Could be any header type
    ByteArrayOutputStream out = new ByteArrayOutputStream ();
    DataOutput dout = new DataOutputStream(out);
    it.add(header1);
    it.add(header2); 
    it.write(dout);
    outheaders = out.toByteArray();
} catch (Exception e) {
    System.out.println("error generating MQ message headers : " + e);
}
BytesMessage newMsg = origSes.createBytesMessage();
newMsg.writeBytes(outheaders);
newMsg.writeBytes(bytes);

newMsg.setStringProperty("JMS_IBM_Format", "MQCICS"); 
newMsg.setIntProperty("JMS_IBM_Encoding", CMQC.MQENC_NATIVE); 
newMsg.setIntProperty("JMS_IBM_Character_Set", 819);

Utilisez toujours les valeurs correctes pour le codage et les arguments characterSet. Lorsque vous lisez les en-têtes, définissez le codage et le CCSID avec lequel le contenu d'octets à été écrit initialement. Lors de l'écriture des en-têtes, définissez le codage et le CCSID à produire. La conversion des données est exécutée automatiquement par les classes d'en-têtes.

Informations supplémentaires sur les classes com.ibm.mq.headers

Le package com.ibm.mq.headers fait partie de l'adaptateur de ressources IBM MQ Resource Adapter qui est installé automatiquement dans WebSphere Application Server. Ce package contient un groupe de classes et d'interfaces qui permettent au programmeur Java™ d'utiliser des en-têtes de message IBM MQ. Ces en-têtes contiennent les classes MQHeaderIterator et MQHeaderList mentionnées dans cette rubrique pour certains en-têtes de message IBM MQ communément utilisés, notamment :
  • MQCIH : pont CICS
  • MQIIH : en-tête d'information IMS
  • MQSAPH : en-tête SAP

Vous pouvez également définir des classes qui représentent vos propres en-têtes.


Icône indiquant le type de rubrique Rubrique de référence



Icône d'horodatage Dernière mise à jour: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=rjc_mqheader_proc
Nom du fichier : rjc_mqheader_proc.html