Pourquoi et quand transmettre la charge utile des messages JMS par référence
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.
Contexte
La spécification JMS 1.1 indique que les messages de type objet sont transmis par valeur. Cela signifie qu'un fournisseur JMS tel que le fournisseur de messagerie par défaut dans WebSphere Application Server doit copier l'objet dans ObjectMessage lorsque celui-ci est défini dans la charge utile du message, au cas où l'application client le modifierait après sa définition. En pratique, cela signifie qu'il est nécessaire de le sérialiser, car il n'existe pas d'autre façon sûre de le copier. La spécification indique également que lorsqu'une application destinataire obtient les données du message, le fournisseur JMS doit créer et renvoyer une copie de ces données.
Si vous activez les propriétés de "transmission de la charge utile des messages par référence", il se peut que la mémoire et les performances de la messagerie JMS soient améliorées.
- Les parties de la spécification JMS qui sont contournées par ces propriétés sont définies pour garantir l'intégrité des données figurant dans les messages.
- Toute application JMS utilisant ces propriétés doit respecter strictement les règles décrites en détail ci-dessous, pour éviter la perte de l'intégrité des données.
- Lisez l'intégralité de cette rubrique avant d'activer les propriétés en question.
- 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.
Avantages de la transmission de la charge utile des messages par référence
- Vos applications JMS respectent les règles décrites dans la section suivante de cette rubrique.
- Vos applications émettrice et destinataire s'exécutent sur la même machine virtuelle Java (serveur) avec le moteur de messagerie qui héberge la destination qu'elles utilisent.
- Si vos applications s'exécutent sur des serveurs différents ou sur la plateforme z/OS (où WebSphere Application Server s'exécute sur plusieurs machines virtuelles Java), les messages de type objet sont sérialisés et leurs performances ne s'améliorent pas. Toutefois, vous pouvez bénéficier d'avantages pour les messages d'octets.
- Il existe de nombreuses conditions d'exécution internes pouvant entraîner la sérialisation de vos messages ; ainsi, même si votre configuration satisfait toutes les conditions décrites dans cette rubrique, il se peut que l'amélioration des performances découlant de l'activation des propriétés de "transmission de la charge utile des messages par référence" soit nulle ou faible.
Degré d'amélioration des performances possible | Evénements de configuration et d'exécution | A quel moment les données sont copiées |
---|---|---|
Aucune amélioration | Les propriétés de "transmission de la charge utile des messages par référence" ne sont pas activées (comportement par défaut). |
Les données des messages de type objet sont copiées dès leur définition dans le message et à leur extraction. Les données des messages d'octets sont copiées dès leur définition dans le message et à leur extraction. |
Quelques améliorations possibles | Les propriétés de "transmission de la charge utile des messages par référence" sont activées et l'une des conditions suivantes ou les deux sont vérifiées :
|
Les données des messages d'octets ne sont copiées que si l'opération est nécessaire. |
Améliorations optimales possibles | Les propriétés de "transmission de la charge utile des messages par référence" sont activées et les deux conditions suivantes sont vérifiées :
|
Les données des messages d'octets ne sont copiées que si l'opération est nécessaire. |
Règles que vos applications JMS doivent respecter
Les parties de la spécification JMS qui sont contournées par les propriétés de "transmission de la charge utile des messages par référence" sont définies pour garantir l'intégrité des données figurant dans les messages. Si vos applications JMS respectent les règles répertoriées dans le tableau ci-dessous, vous pouvez activer les propriétés de "transmission de la charge utile des messages par référence" en toute sécurité pour les fabriques de connexions et les spécifications d'activation que les applications utilisent.
Si vous activez les propriétés de "transmission de la charge utile des messages par référence" pour les applications JMS ne respectant pas ces règles, il se peut que des exceptions soient générées et surtout, que l'intégrité des données figurant dans les messages soit compromise.
Type d'application | Règles |
---|---|
Application émettrice JMS | Une application émettrice JMS qui envoie des messages de type objet ne doit pas modifier l'objet après qu'il a été défini dans la charge utile du message. Une application émettrice JMS qui envoie des messages d'octets :
|
Application destinataire JMS | Une application destinataire JMS qui reçoit des messages de type objet ne doit pas modifier la charge utile qu'elle reçoit du message. |
Application de transmission JMS Remarque : Une application d'acheminement JMS reçoit un message (via une fabrique de connexions ou une spécification d'activation s'il s'agit d'un bean géré par message), puis envoie l'objet message à une autre destination.
|
Une application de transmission JMS qui remplace la charge utile du message reçu par une nouvelle charge utile :
|
Vérifier que les messages de type objet peuvent être sérialisés
Si les conditions de messagerie JMS sont normales (c'est-à-dire si les propriétés de "transmission de la charge utile des messages par référence" ne sont pas activées), les données d'un message de type objet sont sérialisées dès que l'objet est transmis au système de messagerie, par exemple lors d'une opération set (définition) ou send (envoi). Si la charge utile du message ne peut pas être sérialisée, un message d'exception est immédiatement envoyé à l'application client.
Lorsque les propriétés de "transmission de la charge utile des messages par référence" sont activées, la charge utile du message est acceptée de l'application client sans tentative de sérialisation. Si le système découvre ultérieurement que les données ne peuvent pas être sérialisées, il ne peut pas en informer l'application client qui a envoyé le message, et parce que les données ne sont pas sérialisables, il ne peut pas conserver ni transmettre le message complet. Le message et ses propriétés sont stockés, mais les données utilisateur dans le message (la charge) ne peuvent pas être stockées et elles sont supprimées. Si des incidents de sérialisation surviennent lorsque le système tente de convertir un message de type objet en graphique de données pour une médiation, la charge utile du message est effacée et la médiation reçoit un message dont les données sont associées à la valeur null.
Si vos données ne peuvent pas être sérialisées, elles sont perdues. Par conséquent, testez d'abord votre configuration sans activer les propriétés de "transmission de la charge utile des messages par référence" pour vérifier que toutes les données envoyées sur le système sont sérialisables.
- CWSIK0200E: Un objet de la classe "{0}" a été défini dans la charge utile des messages mais il ne peut pas être sérialisé.
- Explication : Un message d'objet a été envoyé, alors que le paramètre producerDoesNotModifyPayloadAfterSet est activé sur sa fabrique de connexions, avec une charge utile qui ne peut pas être sérialisée par le système. Les données de ce message ont été perdues.
- Action : Désactivez le paramètre producerDoesNotModifyPayloadAfterSet de la fabrique de connexions. Si ce paramètre n'est pas activé, l'application JMS qui définit l'objet dans le message recevra les exceptions de sérialisation immédiatement.
- JMS_IBM_ExceptionReason
- SIRCConstants.SIRC0200_OBJECT_FAILED_TO_SERIALIZE
- JMS_IBM_ExceptionTimestamp
- Moment auquel la sérialisation de l'objet a échoué, au format System.currentTimeMillis().
- JMS_IBM_ExceptionMessage
- Message CWSIK0200E, comme décrit précédemment.
- SI_ExceptionReason
- SIRC0200_OBJECT_FAILED_TO_SERIALIZE
- SI_ExceptionTimestamp
- Moment auquel la sérialisation de l'objet a échoué, au format System.currentTimeMillis().
- SI_ExceptionInserts
- Tableau de type "chaîne de caractères" contenant une entrée. L'entrée contient le nom de classe de l'objet.