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.

- 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.
Caso de ejemplo de uso de la aplicación de reenvío | Valor de propiedad consumerDoesNotModify |
producerDoesNotModify forwarderDoesNotModify |
---|---|---|
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);