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.

ATTENTION :
  • 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.
Pour transmettre la charge de messages par référence, définissez les propriétés suivantes sur les fabriques de connexions et les spécifications d'activation :
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

Le tableau ci-dessous répertorie les conditions permettant l'amélioration des performances en cas d'activation des propriétés de "transmission de la charge utile des messages par référence". Les hypothèses suivantes sont appliquées :
  • 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.
Remarque :
  • 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.
Tableau 1. Comment les facteurs de configuration et d'exécution déterminent les données à copier, à quel moment les copier et les améliorations potentielles des performances. La première colonne contient les avantages de performances potentiels. La deuxième colonne indique la configuration et les événements d'exécution des avantages potentiels. La troisième colonne fournit des informations, telles que le type des données copiées lorsque les données sont copiées en fonction de la configuration et des événements d'exécution des avantages potentiels.
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 :
  • L'envoi ou la réception de message est transactionnel.
  • Le destinataire n'est pas disponible lorsque le message est émis.

[AIX Solaris HP-UX Linux Windows][IBM i]Les données des messages de type objet ne sont copiées que si l'opération est nécessaire.

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 :
  • Ni l'envoi ni la réception de message n'est transactionnel.
  • Le destinataire attend le message lorsqu'il est émis (par exemple si le destinataire est un bean géré par message).

[AIX Solaris HP-UX Linux Windows][IBM i]Il se peut que les données des messages de type objet ne soient jamais copié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.

Tableau 2. Règles que vos applications JMS doivent respecter, par type d'application. La première colonne contient la liste des types d'applications JMS. La seconde colonne contient les règles que doit appliquer l'application JMS.
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 :
  • doit écrire les données dans le message avec un appel unique à writeBytes(byte[]),
  • ne doit pas modifier le tableau d'octets après son écriture dans le message.
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 :
  • (pour les messages de type objet) ne doit pas modifier l'objet après qu'il a été défini dans la charge utile du message,
  • (pour les messages d'octets) :
    • doit écrire les données dans le message avec un appel unique à writeBytes(byte[]),
    • ne doit pas modifier le tableau d'octets après son écriture dans le message.

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.

Lorsque le système découvre qu'un message de type objet ne peut pas être sérialisé, il enregistre le message d'erreur suivant (JMS_IBM_ExceptionMessage) dans le fichier SystemOut.log, où "{0}" est le nom de la classe de l'objet défaillant :
Remarque : Cette rubrique fait référence à un ou plusieurs des fichiers journaux de serveur d'applications. Il est recommandé de configurer le serveur de telle sorte qu'il utilise l'infrastructure de journalisation et de trace HPEL (High Performance Extensible Logging) à la place des fichiers SystemOut.log, SystemErr.log, trace.log et activity.log sur les systèmes distribués et IBM® i. Vous pouvez également utiliser HPEL conjointement avec vos fonctions de journalisation z/OS natives. Si vous utilisez l'infrastructure HPEL, vous pouvez accéder à toutes les informations de journalisation et de trace en utilisant l'outil de ligne de commande LogViewer à partir de votre répertoire bin de profil de serveur. Pour plus d'informations sur l'utilisation de HPEL, voir les informations sur l'utilisation de HPEL en vue du traitement des incidents liés aux applications.
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.
Les propriétés d'exception ci-après sont utilisées pour indiquer qu'un objet données ne peut pas être sérialisé et a été effacé. Les applications JMS peuvent déduire l'origine de l'incident à partir des propriétés JMS_IBM_Exception. Les médiations peuvent déduire l'origine de l'incident à partir des propriétés JMS_IBM_Exception et SI_Exception.
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.
Remarque : Il se peut que vos objets données ne peuvent pas être sérialisés parce que vous avez développé vos propres méthodes writeObject() ou writeExternal() et que vous n'avez pas complètement testé chaque option (par exemple les exceptions NullPointer ou ArrayIndexOutOfBounds).

Icône indiquant le type de rubrique Rubrique de concept



Icône d'horodatage Dernière mise à jour: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=cjn_passbyref
Nom du fichier : cjn_passbyref.html