Utilisation de la charge utile des messages

Vous pouvez utiliser la charge utile des messages dans un gestionnaire de médiations préexistant et la convertir d'un format de message vers un autre.

Avant de commencer

Créez ou ouvrez un gestionnaire de médiations dans un projet EJB. Pour plus d'informations, voir Création d'un gestionnaire de médiations. Vous devez également consulter les conseils relatifs à la programmation des médiations dans la rubrique Conseils relatifs au codage pour la programmation des médiations.

Pourquoi et quand exécuter cette tâche

Vous pouvez utiliser cette tâche pour effectuer toutes les opérations suivantes, ou certaines d'entre elles, sur la charge utile du message :
  • Localisez les données dans la charge utile du message
  • Convertissez la charge utile à un autre format
  • Convertissez la charge utile en un tableau d'octets, par exemple si vous souhaitez que la médiation journalise des messages.
Pour utiliser le contenu d'un message, utilisez les API SIMessage et SIMessageContext. Utilisez l'API SIMediationSession pour que la médiation puisse accéder au bus d'intégration de services afin d'envoyer et de recevoir des messages. Pour plus d'informations, voir :

Pour utiliser des zones spécifiques d'un message, faites appel aux graphiques de données SDO (Service Data Objects) Version 1. Pour plus d'informations, voir Graphes de données SDO. Pour plus d'informations sur le format des types de message pris en charge et pour obtenir des exemples d'utilisation, voir la rubrique Mappage des graphiques de données SDO pour des messages des services Web.

Pour utiliser la charge des messages, procédez comme suit :

Procédure

  1. Recherchez le point d'insertion du code de médiation fonctionnel dans votre gestionnaire de médiations, dans la méthode handle (contexte MessageContext). L'interface est MessageContext ; vous devez la transtyper en SIMessageContext sauf si vous ne souhaitez utiliser que les méthodes fournies par MessageContext.
  2. Extrayez le graphique des données de la charge du message de la manière suivante :
    1. Extrayez l'interface SIMessage de l'objet MessageContext. Exemple :
      SIMessage message = ((SIMessageContext)context).getSIMessage();
    2. Extrayez la chaîne du format du message pour déterminer son type. Exemple :
      String messageFormat = message.getFormat();
    3. Extrayez l'objet DataGraph du message. Exemple :
      DataGraph dataGraph = message.getDataGraph();
      Pour plus d'informations, voir Graphes de données SDO.
  3. Facultatif : Localisez les données dans la charge utile :
    1. Recherchez un objet de données nommé dans le graphique. Par exemple, si DataObject a pour nom "data" :
      DataObject dataObject = dataGraph.getRootObject().getDataObject("data");
    2. Extrayez les informations contenues dans l'objet de données. Par exemple, dans le cas d'un message textuel :
      String textInfo = dataObject.getString("value");
  4. Utilisez les zones du message. Pour savoir comment procéder, voir Exemple de code des zones de message.
  5. Facultatif : Convertissez la charge utile dans un autre format :
    1. Consultez la rubrique Conversion entre les formats de message pour comprendre les implications du codage de la charge utile.
    2. Appelez la méthode getNewDataGraph, en transmettant le nouveau format en tant que paramètre, qui renvoie une copie de la charge au nouveau format. Exemple :
      DataGraph newDataGraph = message.getNewDataGraph(newFormat);
    3. Rédigez le graphique des données au nouveau format du message à l'aide de la méthode setDataGraph. Exemple :
      message.setDataGraph(newDataGraph, newFormat);
  6. Facultatif : Convertissez la charge utile en un flux d'octets :
    1. Consultez les rubriques Conversion de la charge utile d'un message en tableau d'octets et Conversion d'un tableau d'octets en charge utile de message afin de comprendre les conséquences de la conversion entre le format de message et le flux d'octets et inversement.
    2. Appelez la méthode getDataGraphAsBytes, qui renvoie une copie de la charge sous la forme d'un flux d'octets. Exemple :
      byte[] newByteArray = message.getDataGraphAsBytes();
    3. Appelez la méthode createDataGraph fournie par l'API SIDataGraphFactory qui crée un graphique de données en analysant les octets en fonction du format transmis à la méthode. Exemple :
      DataGraph newDataGraph = SIDataGraphFactory.getInstance().createDataGraph( byteArray, format);
    4. Utilisez le message sous forme de flux d'octets. Pour savoir comment procéder, voir Exemple de code des zones de message
  7. Renvoyez la valeur True dans votre code de médiation pour que l'interface MessageContext soit transmise au prochain gestionnaire de médiations de la liste des gestionnaires. Si la valeur renvoyée est False, le contexte MessageContext est ignoré et ne sera pas transmis à la destination.
    Remarque : S'il s'agit du dernier gestionnaire de la liste et que le chemin de routage de transmission est vide, le message est accessible par les applications de réception sur cette destination. Si le chemin de routage de transmission n'est pas vide, le message n'est pas disponible pour les destinataires sur cette destination. A la place, le message est transmis à la destination suivante du chemin de routage.

Exemple de code des zones de message

public boolean handle(MessageContext context) throws MessageContextException {
	
	/* Get the SIMessage from the MessageContext object */
	SIMessage message = ((SIMessageContext)context).getSIMessage(); 
	
	/* Get the message format string */
	String messageFormat = message.getFormat(); 
	
	/* If you have a JMS TextMessage then extract the text contained in the message.	*/
	if(messageFormat.equals("JMS:text"))
	{
		/* Retrieve the DataGraph object from the message */
		DataGraph dataGraph = message.getDataGraph();
		
		/* Navigate down the DataGraph to the DataObject named 'data'. */
		DataObject dataObject = dataGraph.getRootObject().getDataObject("data");
		
		/* Retrieve the text information contained in the DataObject. */
		String textInfo = dataObject.get("value");
		
		/* Use the text information retrieved */
		System.out.println(textInfo);
	}
	
	
	/* Return true so the MessageContext is passed to any other mediation handlers
	* in the handler list	*/
	return true;
	
	}
Le code complet de la fonction de médiation permettant d'utiliser la charge utile du message sous la forme d'un flux d'octets peut se présenter comme dans l'exemple suivant :
  public boolean handle(MessageContext context)throws MessageContextException {
  
		/* Get the SIMessage from the MessageContext object */
		SIMessage message = ((SIMessageContext)context).getSIMessage(); 
    
    if (!SIApiConstants.JMS_FORMAT_MAP.equals(msg.getFormat()))
    {
      try
      {
        dumpBytes(msg.getDataGraphAsBytes());
      }
      catch(Exception e)
      {
        System.out.println("The message contents could not be retrieved due to a "+e);
      }
    }
    else
    {
      System.out.println("The bytes for a JMS:map format message cannot be shown.");
    }
    
    return true;
  }
  
  private static void dumpBytes(byte[] bytes)
  {
    // Subroutine to dump the bytes in a readable form to System.out
  }
}

Icône indiquant le type de rubrique Rubrique de tâche



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=tjy1501
Nom du fichier : tjy1501.html