Cómo trabajar con la carga del mensaje

Puede trabajar con la carga del mensaje en un manejador de mediaciones existente previamente y transcodificar la carga del mensaje de un formato a otro.

Antes de empezar

Cree o abra un manejador de mediaciones en un proyecto EJB. Para obtener más información, consulte Escribir un manejador de mediación. También debe leer los conjuntos para programar mediaciones satisfactoriamente en el tema Sugerencias de codificación para la programación de mediaciones.

Acerca de esta tarea

Puede utilizar esta tarea para completar algunas o todas las acciones siguientes en la carga del mensaje:
  • Localice los objetos de datos en la carga del mensaje
  • Convierta la carga en otro formato
  • Convierta la carga en un conjunto de bytes, por ejemplo, si desea que la mediación anote mensajes.
Para trabajar con el contenido de un mensaje, utilice las API SIMessage y SIMessageContext. Además, utilice SIMediationSession para proporcionar acceso al bus de integración de servicios a la mediación para que pueda enviar y recibir mensajes. Para obtener más información, consulte:

Para trabajar con campos específicos dentro de un mensaje, utilice los gráficos de datos SDO (objetos de datos de servicio)Versión 1. Para obtener más información, consulte Gráficos de datos SDO. Para obtener más información sobre el formato de los tipos de mensaje soportados y ejemplos de cómo trabajar con ellos, consulte Correlación de gráficos de datos SDO para mensajes de servicios web.

Para trabajar con la carga del mensaje, siga estos pasos:

Procedimiento

  1. Localice el punto del manejador de mediación en el que desea insertar el código de mediación funcional, en el método handle (MessageContext context). La interfaz es MessageContext, y debe convertirla en SIMessageContext, a menos que sólo desee trabajar con los métodos proporcionados por MessageContext.
  2. Recupere el gráfico de datos de la carga del mensaje de la manera siguiente:
    1. Obtenga el SIMessage del objeto MessageContext. Por ejemplo:
      SIMessage message = ((SIMessageContext)context).getSIMessage();
    2. Obtenga la serie del formato del mensaje para determinar su tipo. Por ejemplo:
      String messageFormat = message.getFormat();
    3. Recupere el objeto DataGraph del mensaje. Por ejemplo:
      DataGraph dataGraph = message.getDataGraph();
      Para obtener más información, consulte Gráficos de datos SDO.
  3. Opcional: Localice objetos de datos en la carga del mensaje:
    1. En el gráfico, vaya a un objeto denominado DataObject. Por ejemplo, donde DataObject tiene el nombre "data":
      DataObject dataObject = dataGraph.getRootObject().getDataObject("data");
    2. Recupere la información contenida en el objeto de datos. Por ejemplo, si el mensaje es un mensaje de texto:
      String textInfo = dataObject.getString("value");
  4. Trabaje con los campos del mensaje. Para ver un ejemplo de cómo hacerlo, consulte Código de ejemplo para campos de mensaje.
  5. Opcional: Realice una transcodificación de la carga a otro formato:
    1. Revise el tema Transcodificación entre formatos de mensaje para entender las implicaciones de la transcodificación de la carga.
    2. Llame al método getNewDataGraph, pasando el nuevo formato como parámetro, lo que devolverá una copia de la carga con el nuevo formato. Por ejemplo:
      DataGraph newDataGraph = message.getNewDataGraph(newFormat);
    3. Escriba de nuevo en el mensaje el gráfico de datos con el nuevo formato utilizando el método setDataGraph. Por ejemplo:
      message.setDataGraph(newDataGraph, newFormat);
  6. Opcional: Convierta la carga en una corriente de bytes:
    1. Revise los temas Transcodificación de una carga del mensaje en una matriz de bytes y Transcodificación de una matriz de bytes en una carga del mensaje para entender las implicaciones de la conversión entre el formato de mensaje y la corriente de bytes, y viceversa.
    2. Llame al método getDataGraphAsBytes, que devolverá una copia de la carga como corriente de bytes. Por ejemplo:
      byte[] newByteArray = message.getDataGraphAsBytes();
    3. Llame al método createDataGraph proporcionado por la API SIDataGraphFactory, que crea un nuevo gráfico de datos analizando los bytes de acuerdo con el formato pasado al método. Por ejemplo:
      DataGraph newDataGraph = SIDataGraphFactory.getInstance().createDataGraph( byteArray, format);
    4. Trabaja con el mensaje como una secuencia de bytes. Para ver un ejemplo de cómo hacerlo, consulte Código de ejemplo para campos de mensaje
  7. Devuelva el valor True en el código de mediación, de modo que se pase MessageContext al siguiente manejador de mediación en la lista de manejadores. Si el valor de retorno es False, MessageContext se descartará y no se entregará al destino.
    Nota: Si el manejador de mediación es el último de la lista de manejadores y la ruta de direccionamiento está vacía, el mensaje queda disponible para las aplicaciones consumidoras en ese destino. Si la ruta de direccionamiento de reenvío no está vacía, el mensaje no estará disponible para los consumidores en ese destino, sino que se reenviará al siguiente destino de la ruta de direccionamiento.

Código de ejemplo para campos de mensaje

public boolean handle(MessageContext context) throws MessageContextException {
	
		/* Obtener SIMessage del objeto MessageContext */
		SIMessage message = ((SIMessageContext)context).getSIMessage(); 
	
		/* Obtener la serie de formato del mensaje */
		String messageFormat = message.getFormat(); 
	
		/* Si tiene un JMS TextMessage, extraiga el texto incluido en el mensaje.	*/
		if(messageFormat.equals("JMS:text"))
	{
				/* Recuperar el objeto DataGraph del mensaje */
				DataGraph dataGraph = message.getDataGraph();
		
				/* Navegar por DataGraph hasta DataObject de nombre 'data'. */
				DataObject dataObject = dataGraph.getRootObject().getDataObject("data");
		
				/* Recuperar la información del texto contenida en DataObject. */
				String textInfo = dataObject.get("value");
		
				/* Utilizar la información de texto recuperada */
				System.out.println(textInfo);
	}
	
	
		/* Devolver true de modo que MessageContext se pase a otros manejadores de mediaciones
		* de la lista de manejadores	*/
	return true;
	
	}
El código de función de mediación completo para trabajar con la carga del mensaje como una secuencia de bytes podría tener un aspecto parecido a este ejemplo:
  public boolean handle(MessageContext context) throws MessageContextException {
  
			/* Obtener SIMessage del objeto MessageContext */
			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("Los bytes para un mensaje con el formato JMS:map no se muestran.");
    }
    
    return true;
  }
  
  private static void dumpBytes(byte[] bytes)
  {
    // Subroutine to dump the bytes in a readable form to System.out
  }
}

Icon that indicates the type of topic Task topic



Timestamp icon Last updated: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tjy1501
File name: tjy1501.html