Pasar carga útil de mensajes por referencia: ventajas potenciales para cada paso de proceso
Para cada paso de proceso que realiza la aplicación de mensajería JMS, compruebe esta tabla para ver por qué y cuándo hay una ventaja potencial de rendimiento si se habilitan las propiedades "pasar carga útil de mensajes por referencia" en la especificación de activación o en la fábrica de conexiones asociada.
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.
- producerDoesNotModifyPayloadAfterSet (para fábricas de conexiones) o forwarderDoesNotModifyPayloadAfterSet (para especificaciones de activación)
- Cuando esta propiedad está habilitada, el objeto o los mensajes de bytes producidos por la fábrica de conexiones o remitidos a través de la especificación de activación no se copian cuando se establecen en el mensaje y sólo se serializan cuando es absolutamente necesario. Las aplicaciones que envían estos mensajes no deben modificar los datos hasta que se hayan establecido en el mensaje.
- consumerDoesNotModifyPayloadAfterGet
- Cuando esta propiedad está habilitada, los mensajes de objeto recibidos a través de la fábrica de conexiones o la especificación de activación sólo se serializan cuando es absolutamente necesario. Las aplicaciones no deben modificar los datos obtenidos de estos mensajes.
Paso de proceso | ¿Hay potencial para la mejora en el rendimiento? | Explicación |
---|---|---|
Objetos de mensajes con aplicaciones generadoras y consumidoras | ||
Un mensaje de objeto se envía a una aplicación consumidora en la misma JVM. Las propiedades producerDoesNotModifyPayloadAfterSet y consumerDoesNotModifyPayloadAfterGet están las dos habilitadas. | Sí | Bajo determinadas condiciones, el objeto de carga útil se pasa por referencia a la aplicación consumidora. Si el mensaje no es persistente ni se tramita, y la aplicación consumidora está disponible inmediatamente, puede que el objeto de carga útil nunca se serialice. |
Un mensaje de objeto se produce con la propiedad producerDoesNotModifyPayloadAfterSet habilitada, y luego lo recibe una aplicación consumidora para la que la propiedad consumerDoesNotModifyPayloadAfterGet no está habilitada. | No | No se obtiene ninguna ventaja porque la aplicación consumidora no tiene habilitada la propiedad consumerDoesNotModifyPayloadAfterGet. |
Un mensaje de objeto se envía a una única aplicación consumidora en una JVM distinta. Las propiedades producerDoesNotModifyPayloadAfterSet y consumerDoesNotModifyPayloadAfterGet están las dos habilitadas. | No | No se obtiene ninguna ventaja porque la aplicación consumidora única está en otra JVM. |
Varias aplicaciones consumidoras (un tema) que tienen habilitada la propiedad consumerDoesNotModifyPayloadAfterGet y que se ejecutan en la misma JVM reciben un mensaje de objeto. | Sí | Todas las aplicaciones consumidoras con la propiedad consumerDoesNotModifyPayloadAfterGet habilitada pueden recibir una referencia al mismo objeto, aunque esto no está garantizado. |
Mensajes de objeto con aplicaciones de reenvío | ||
Un mensaje de objeto se envía y la aplicación de envío accede a la carga útil del mensaje. Las propiedades consumerDoesNotModifyPayloadAfterGet y producer/forwarderDoesNotModifyPayloadAfterSet están habilitadas. | Sí | Existe una ventaja potencial en el rendimiento en los siguientes casos:
|
Un mensaje de objeto se envía y la aplicación de envío accede a la carga útil del mensaje. Sólo está habilitada la propiedad producer/forwarderDoesNotModifyPayloadAfterSet. | Sí | Existe una ventaja potencial en el rendimiento si el consumidor del mensaje de reenvío tiene habilitada la propiedad consumerDoesNotModifyPayloadAfterGet y está en la misma JVM que la aplicación de reenvío. |
Un mensaje de objeto se envía y la aplicación de envío no accede a la carga útil del mensaje. | No | Si la aplicación de reenvío no puede acceder a la carga útil del mensaje de objeto, las propiedades producer/forwarderDoesNotModifyPayloadAfterSet y consumerDoesNotModifyPayloadAfterGet no tienen ningún efecto para la aplicación de reenvío. Se mantienen las ventajas obtenidas de la aplicación generadora original y la aplicación consumidor final. |
Mensajes de objeto con mediaciones | ||
Un mensaje de objeto se envía a un destino de bus de integración de servicios mediado. | No | Si el mensaje de objeto se envía a un destino mediado, no se obtiene ninguna ventaja en el rendimiento habilitando la propiedad producerDoesNotModifyPayloadAfterSet. |
Mensajes de bytes con aplicaciones consumidoras | ||
Un mensaje de bytes se envía a cualquier aplicación consumidora. La propiedad producerDoesNotModifyPayloadAfterSet está habilitada. | Sí | Se omite la parte de la especificación JMS que manda copiar los datos estableciéndolo en el mensaje, guardando una copia de los datos de bytes. |
Un mensaje de bytes se recibe con la propiedad consumerDoesNotModifyPayloadAfterGet habilitada. | No | La API JMS no permite volver a pasar los datos por referencia al código de consumidor (métodos BytesMessage.readBytes). |
Varios consumidores (un tema) que tienen habilitada la propiedad consumerDoesNotModifyPayloadAfterGet reciben un mensaje de bytes. | No | La API JMS no permite volver a pasar los datos por referencia al código de consumidor (métodos BytesMessage.readBytes). |
Mensajes de bytes con aplicaciones de reenvío | ||
Se reenvía un mensaje de bytes. | No | No se obtiene ninguna ventaja de habilitar cualquiera de las propiedades "pasar carga útil de mensajes por referencia". |