Transmission de la charge de messages par référence : Avantages potentiels de chaque étape de traitement
Pour chaque étape de traitement effectuée par votre application de messagerie JMS, consultez cette table pour savoir quand et pourquoi il existe un gain de performances potentiel si vous activez les propriétés de "transmission de la charge utile des messages par référence" sur la spécification d'activation ou la fabrique de connexions associée.
Lorsque des messages volumineux de type objet ou octet sont envoyés, la quantité de mémoire et le traitement processeur nécessaires pour sérialiser, désérialiser et copier les messages peuvent être importants. Si vous activez les propriétés de transmission de la charge de messages par référence sur une fabrique de connexions ou une spécification d'activation, vous pouvez demander au fournisseur de messagerie par défaut d'ignorer la spécification JMS 1.1 et de limiter fortement ou d'ignorer la copie de ces données.
- Paramètre de la propriété producerDoesNotModifyPayloadAfterSet (pour les fabriques de connexions) ou forwarderDoesNotModifyPayloadAfterSet (pour les spécifications d'activation)
- Lorsque cette propriété est activée, les messages de type objet ou octet générés par la fabrique de connexions ou acheminés via la spécification d'activation ne sont pas copiés lorsqu'ils sont définis dans le message et sont uniquement sérialisés lorsque cela s'avère nécessaire. Les applications qui envoient ce type de message ne doivent pas modifier les données une fois que celles-ci sont définies dans le message.
- consumerDoesNotModifyPayloadAfterGet
- Lorsque cette propriété est activée, les messages de type objet reçus via la fabrique de connexions ou la spécification d'activation ne sont sérialisés que lorsque cela s'avère absolument nécessaire. Les données obtenues à partir de ces messages ne doivent pas être modifiées par les applications.
Etape de traitement | Optimisation des performances possible ? | Explication |
---|---|---|
Messages de type objet avec des applications émettrices et destinataires | ||
Un message de type objet est envoyé à une application destinataire dans la même machine JVM. Les propriétés producerDoesNotModifyPayloadAfterSet et consumerDoesNotModifyPayloadAfterGet sont toutes deux activées. | Yes | Dans certaines conditions, l'objet de charge est transmis par référence à l'application destinataire. Si le message n'est pas persistant ou n'est pas inclus dans la transaction et que l'application destinataire est immédiatement disponible, l'objet de charge risque de n'être jamais sérialisé. |
Un message de type objet est généré avec la propriété producerDoesNotModifyPayloadAfterSet activée, reçu par une application destinataire pour laquelle la propriété consumerDoesNotModifyPayloadAfterGet n'est pas activé. | Non | Il n'y a aucun avantage car l'application destinataire n'a pas la propriété consumerDoesNotModifyPayloadAfterGet activée. |
Un message de type objet est envoyé à une application destinataire unique dans une machine JVM différente. Les propriétés producerDoesNotModifyPayloadAfterSet et consumerDoesNotModifyPayloadAfterGet sont toutes deux activées. | Non | Il n'y a aucun avantage obtenu car l'application destinataire unique se trouve dans une autre JVM. |
Un message de type objet est reçu par plusieurs applications destinataires (sujet) qui possèdent toutes la propriété consumerDoesNotModifyPayloadAfterGet activée et s'exécutent toutes dans la même machine JVM. | Yes | Toutes les applications destinataires dotées de la propriété consumerDoesNotModifyPayloadAfterGet activée peuvent recevoir une référence au même objet mais ce n'est pas garantie. |
Messages de type objet avec des applications de réacheminement | ||
Un message de type objet est réacheminé et l'application de réacheminement accède à la charge du message. Les propriétés consumerDoesNotModifyPayloadAfterGet et producer/forwarderDoesNotModifyPayloadAfterSet sont activées. | Yes | Il y a un gain de performances potentiel dans les cas suivants :
|
Un message de type objet est réacheminé et l'application de réacheminement accède à la charge du message. Seule la propriété producer/forwarderDoesNotModifyPayloadAfterSet est activée. | Yes | Les performances peuvent être améliorées si le destinataire du message réacheminé possède la propriété consumerDoesNotModifyPayloadAfterGet activée et se trouve dans la même machine JVM que l'application de réacheminement. |
Un message de type objet est réacheminé et l'application de réacheminement n'accède pas à la charge du message. | Non | Si l'application de réacheminement n'accède pas à la charge du message de type objet, les propriétés producer/forwarderDoesNotModifyPayloadAfterSet et consumerDoesNotModifyPayloadAfterGet n'ont pas d'effet pour l'application de réacheminement. Les avantages obtenus de l'application émettrice d'origine ou l'application destinataire finale sont conservés. |
Messages de type objet avec des médiations | ||
Un message de type objet est envoyé à une destination de bus d'intégration de services soumis à une médiation. | Non | Si le message de type objet est envoyé à une destination soumise à une médiation, l'activation de la propriété producerDoesNotModifyPayloadAfterSet n'entraîne pas une amélioration des performances. |
Messages de type octet avec des applications destinataires | ||
Un message de type octet est envoyé à une application destinataire. La propriété producerDoesNotModifyPayloadAfterSet est activée. | Yes | La partie de la spécification JMS qui demande la copie des données lors de leur définition dans le message est ignorée, ce qui permet d'éviter une copie des données de type octet. |
Un message de type octet est reçu avec la propriété consumerDoesNotModifyPayloadAfterGet activée. | Non | L'API JMS ne permet pas de renvoyer par référence les données de type octet au code destinataire (méthodes BytesMessage.readBytes). |
Un message de type octet est reçu par plusieurs destinataires (un sujet) qui ont tous la propriété consumerDoesNotModifyPayloadAfterGet activée. | Non | L'API JMS ne permet pas de renvoyer par référence les données de type octet au code destinataire (méthodes BytesMessage.readBytes). |
Messages de type octet avec des applications de réacheminement | ||
Un message d'octets est acheminé. | Non | Il n'y a pas d'avantages liés à l'activation de l'une des propriétés de transmission de la charge de messages par référence. |