Cómo pasar carga útil de mensajes por referencia: casos de ejemplo de uso y código de ejemplo para las aplicaciones de reenvío

Una aplicación de reenvío JMS recibe un mensaje (a través de una fábrica de conexiones o, si es un bean controlado por mensajes, a través de una especificación de activación) y luego envía el objeto del mensaje a otro destino. Explore los distintos caso de ejemplo de uso y codifique las aplicaciones de reenvío JMS para así poder pasar de forma segura cargas útiles de mensajes por referencia al reenviar mensajes de una cola a otra dentro de un servidor único.

Cuando se envían mensajes de objetos o de bytes de gran tamaño, el coste en memoria y el uso del procesador para serializar, deserializar y copiar la carga de trabajo del mensaje puede ser muy significativo. Si se habilitan las propiedades pasar carga útil de mensajes por referencia en una fábrica de conexiones o especificación de activación, se indica al proveedor de mensajería predeterminado que altere temporalmente la especificación JMS 1.1 y reduzca u omita potencialmente esta copia de datos.

En la figura siguiente, los mensajes pasan de la cola1 (queue1) de un motor de mensajería, a través de una especificación de activación o fábrica de conexiones consumidora, a una aplicación de reenvío JMS. A continuación, se reenvían, a través de una fábrica de conexiones generadora, a la cola2 (queue2) en el mismo motor de mensajería.

PRECAUCIÓN:
Las partes de la Especificación JMS que se omiten en estas propiedades se definen para garantizar la integridad de datos de mensajes. Cualquiera de las aplicaciones JMS que utilice estas propiedades debe seguir de forma estricta las reglas descritas, de lo contrario, se puede perder la integridad de los datos.
Figura 1. Reenvío de mensajes
La figura ilustra el flujo de mensajes de una cola a otra. Desde queue1, los mensajes pasan a la aplicación de reenvío JMS a través de la especificación de activación o propiedad de fábrica de conexiones del consumidor. Desde la aplicación de reenvío JMS, los mensajes se reenvían a queue2 a través de la propiedad de fábrica de conexiones de generador.
Para comprender los casos de ejemplo de uso y el código de ejemplo asociado indicado en este tema, es necesario observar estas características importantes de una aplicación de reenvío JMS:
  • Una aplicación de reenvío no sustituye el objeto de mensaje. Esto es útil si la aplicación únicamente registra cronológicamente o si no graba (por ejemplo, imprimiendo) el mensaje antes de reenviarlo, y también significa que el mensaje reenviado retiene algunas propiedades de mensajes útiles como las propiedades JMSCorrelationID, JMSReplyTo y JMSType.
  • Una aplicación de reenvío puede modificar o sustituir la carga útil del mensaje. Si sustituye la carga útil, establece la nueva carga útil en el objeto de mensaje y cambia la referencia de carga útil de modo que apunte a la nueva carga útil del mensaje.
  • Para una aplicación de reenvío, el mensaje reenviado lo "crea" y configura la especificación de activación o la fábrica de conexiones consumidora. La fábrica de conexiones generadora se utiliza únicamente para dirigir el mensaje reenviado y no tiene ninguna repercusión sobre el contenido del mensaje reenviado.

En la tabla siguiente se describen los cuatro casos de ejemplo de uso de aplicación de reenvío que afectan al modo en que se establecen las propiedades para pasar carga útil de mensaje por referencia ("pass message payload by reference"). Tenga en cuenta que, puesto que la fábrica de conexiones generadora no repercute en el contenido del mensaje reenviado, debe establecer las propiedades de consumidor y las propiedades de generador/reenvío en la especificación de activación o fábrica de conexiones consumidora.

Tabla 1. Efecto de los valores de la propiedad "pasar carga útil de mensajes por referencia" en los escenarios de utilización de la aplicación de reenvío. La primera columna de la tabla incluye los cuatro casos de ejemplo de uso de la aplicación de reenvío. La segunda columna indica el valor de la propiedad del consumidor para los casos. La tercera columna indica el valor de la propiedad de especificación de activación o conexión para los casos de ejemplo.
Caso de ejemplo de uso de la aplicación de reenvío

Valor de propiedad consumerDoesNotModify
PayloadAfterGet

property setting

producerDoesNotModify
PayloadAfterSet

(para fábricas de conexiones) o

forwarderDoesNotModify
PayloadAfterSet

(para especificaciones de activación)
Caso de ejemplo 1: la aplicación recibe un mensaje, examina la carga útil pero no la modifica, y reenvía el mensaje sin modificarlo ni sustituir la carga útil. Habilitada No es necesaria, pero puede habilitarse
Caso de ejemplo 2: la aplicación recibe un mensaje, examina la carga útil pero no la modifica, sustituye la carga útil del mensaje por una nueva carga útil y reenvía el mensaje sin modificar la carga útil después de la llamada para establecerla en el mensaje. Habilitada Habilitada
Caso de ejemplo 3: la aplicación recibe un mensaje, examina la carga útil y la modifica y, a continuación, vuelve a establecer la carga útil modificada o algún otro dato en el mensaje y envía el mensaje sin modificar adicionalmente la carga útil después de la llamada para establecerla en el mensaje. No habilitada Habilitada
Caso de ejemplo 4: la aplicación recibe un mensaje, examina y modifica la carga útil y, a continuación, vuelve a establecer la carga útil modificada o algún otro dato en el mensaje y modifica adicionalmente la carga útil después de la llamada para establecerla en el mensaje. No habilitada No habilitada

Para los casos de ejemplo 1, 2 y 3 puede habilitar una o más propiedades "pasar carga útil de mensajes por referencia", siempre que la aplicación de reenvío pueda garantizar que funcione como se describe en el caso de ejemplo. Para ayudarle a lograrlo, a continuación se muestra un código de ejemplo que puede adaptar para utilizarlo en los aplicaciones.

Aplicación de envío: caso de ejemplo 1

La aplicación recibe un mensaje, examina la carga útil pero no la modifica, y reenvía el mensaje sin modificarlo ni sustituir la carga útil.

public void onMessage (Message message)
{
   ObjectMessage oMessage = (ObjectMessage) message;
   DataObject data = oMessage.getObject();
   System.out.print(data.getXXX());
   System.out.print(data.getYYY());

   // obtener una sesión para reenviar el mensaje recibido
   
   producer.send(message); 
   session.close();
}

Aplicación de reenvío: caso de ejemplo 2

La aplicación recibe un mensaje, examina la carga útil pero no la modifica, sustituye la carga útil en el mensaje con la nueva carga útil y reenvía el mensaje si modificar la carga útil después de la llamada para establecerla en el mensaje.

public void onMessage (Message message)
{
   ObjectMessage oMessage = (ObjectMessage) message;
   DataObject data = oMessage.getObject();
   System.out.print(data.getXXX());
   System.out.print(data.getYYY());

   // obtener una sesión para reenviar el mensaje recibido
   
   message.setObject(newData);

   producer.send(message); 
   session.close();
}
Para los mensajes de bytes, la aplicación también debe garantizar sólo la grabación de una sola matriz de bytes completa en el mensaje.
byte [] data = myByteData; 
BytesMessage message = session.createBytesMessage(); 
message.writeBytes(data); 
data = null;	 
producer.send(message); 

Aplicación de envío: caso de ejemplo 3

La aplicación recibe un mensaje, examina la carga útil y la modifica y, a continuación, vuelve a establecer la carga útil modificada o algún otro dato en el mensaje y envía el mensaje sin modificar más la carga útil después de la llamada para establecerlo en el mensaje.

public void onMessage (Message message)
{
   ObjectMessage oMessage = (ObjectMessage) message;
   DataObject data = oMessage.getObject();
   System.out.print(data.getXXX());
   System.out.print(data.getYYY());

   // obtener una sesión para reenviar el mensaje recibido

   data.setXXX(xxx);
   data.setYYY(yyy);
   message.setObject(data);

   producer.send(message); 
   session.close();
}
Para los mensajes de bytes, la aplicación también debe garantizar sólo la grabación de una sola matriz de bytes completa en el mensaje.
byte [] data = myByteData; 
BytesMessage message = session.createBytesMessage(); 
message.writeBytes(data); 
data = null;	 
producer.send(message); 

Icon that indicates the type of topic Concept topic



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