Übergabe von Nachrichtennutzdaten nach Referenz: Potenzielle Vorteile für jeden Verarbeitungsschritt
Dieser Artikel enthält eine Tabelle, in der für jeden Verarbeitungsschritt, der von Ihrer JMS-Messaging-Anwendung ausgeführt wird, detailliert beschrieben wird, warum und wann die Aktivierung der Eigenschaften für die "Übergabe von Nachrichtennutzdaten nach Referenz" in der zugeordneten Verbindungsfactory oder Aktivierungsspezifikation Leistungsvorteile bringen kann.
Wenn große Objektnachrichten oder Bytenachrichten gesendet werden, können die Kosten für die Speicher- und Prozessornutzung, die durch das Serialisieren, Deserialisieren und Kopieren der Nachrichtennutzdaten entstehen, beträchtlich sein. Wenn Sie die Eigenschaften für die Übernahme von Nachrichtennutzdaten nach Referenz in einer Verbindungsfactory oder Aktivierungsspezifikation aktivieren, teilen Sie dem Standard-Messaging-Provider dadurch mit, die Spezifikation JMS 1.1 zu überschreiben und das Kopieren der Daten nach Möglichkeit einzuschränken oder zu umgehen.
- producerDoesNotModifyPayloadAfterSet (für Verbindungsfactorys) oder forwarderDoesNotModifyPayloadAfterSet (für Aktivierungsspezifikationen)
- Wenn diese Eigenschaft aktiviert ist, werden Objekt- oder Bytenachrichten, die von der Verbindungsfactory erzeugt oder über die Aktivierungsspezifikation weitergeleitet werden, nicht kopiert, wenn sie in der Nachricht festgelegt werden, und nur dann serialisiert, wenn es unbedingt erforderlich ist. Anwendungen, die solche Nachrichten senden, dürfen die Daten, nachdem sie in die Nachricht gestellt wurden, nicht mehr ändern.
- consumerDoesNotModifyPayloadAfterGet
- Wenn diese Eigenschaft aktiviert ist, werden Objektnachrichten, die über die Verbindungsfactory oder Aktivierungsspezifikation empfangen werden, nur serialisiert, wenn es unbedingt erforderlich ist. Die aus diesen Nachrichten abgerufenen Daten dürfen von Anwendungen nicht geändert werden.
Verarbeitungsschritt | Leistungsverbesserung möglich? | Erläuterung |
---|---|---|
Objektnachrichten mit Erzeuger- und Konsumentenanwendungen | ||
Es wird eine Objektnachricht an eine Konsumentenanwendung in derselben JVM gesendet. Die Eigenschaften "producerDoesNotModifyPayloadAfterSet" und "consumerDoesNotModifyPayloadAfterGet" sind aktiviert. | Ja | Unter bestimmten Bedingungen wird das Nutzdatenobjekt nach Referenz an die Konsumentenanwendung übergeben.
Wenn die Nachricht nicht persistent und nicht abgeschlossen und die Konsumentenanwendung sofort verfügbar ist, wird das Nutzdatenobjekt möglicherweise nie serialisiert. |
Eine Objektnachricht wird mit aktivierter Eigenschaft "producerDoesNotModifyPayloadAfterSet" erzeugt und anschließend von einer Konsumentenanwendung empfangen, für die die Eigenschaft "consumerDoesNotModifyPayloadAfterGet" nicht aktiviert ist. | Nein | Es kann keine Leistungsverbesserung erzielt werden, weil in der Konsumentenanwendung die Eigenschaft "consumerDoesNotModifyPayloadAfterGet" nicht aktiviert ist. |
Eine Objektnachricht wird an eine einzige Konsumentenanwendung in einer anderen JVM gesendet. Die Eigenschaften "producerDoesNotModifyPayloadAfterSet" und "consumerDoesNotModifyPayloadAfterGet" sind aktiviert. | Nein | Es kann keine Leistungsverbesserung erzielt werden, weil sich diese Konsumentenanwendung in einer anderen JVM befindet. |
Eine Objektnachricht wird von mehreren Konsumentenanwendungen (Topic) empfangen, für die alle die Eigenschaft "consumerDoesNotModifyPayloadAfterGet" aktiviert ist und die alle in derselben JVM ausgeführt werden. | Ja | Alle Konsumentenanwendungen, für die die Eigenschaft "consumerDoesNotModifyPayloadAfterGet" aktiviert ist, können eine Referenz auf dasselbe Objekt empfangen, obwohl dies nicht garantiert ist. |
Objektnachrichten mit Weiterleitungsanwendungen | ||
Eine Objektnachricht wird weitergeleitet, und die Weiterleitungsanwendung greift auf die Nutzdaten der Nachrichten zu. Die Eigenschaften "consumerDoesNotModifyPayloadAfterGet" und "producer/forwarderDoesNotModifyPayloadAfterSet" sind aktiviert. | Ja | In den folgenden Fällen kann eine Leistungsverbesserung erzielt werden:
|
Eine Objektnachricht wird weitergeleitet, und die Weiterleitungsanwendung greift auf die Nutzdaten der Nachrichten zu. Es ist nur die Eigenschaft "producer/forwarderDoesNotModifyPayloadAfterSet" aktiviert. | Ja | Es kann eine Leistungsverbesserung erzielt werden, wenn für den Konsumenten der weitergeleiteten Nachricht die Eigenschaft "consumerDoesNotModifyPayloadAfterGet" aktiviert ist und er sich in derselben JVM wie die Weiterleitungsanwendung befindet. |
Eine Objektnachricht wird weitergeleitet, und die Weiterleitungsanwendung greift nicht auf die Nutzdaten der Nachrichten zu. | Nein | Wenn die Weiterleitungsanwendung nicht auf die Nutzdaten der Objektnachricht zugreift, haben die Eigenschaften "producer/forwarderDoesNotModifyPayloadAfterSet" und "consumerDoesNotModifyPayloadAfterGet" keine Auswirkungen auf die Weiterleitungsanwendung. Die Leistungen der ursprünglichen Erzeugeranwendung und der endgültigen Konsumentenanwendung bleiben erhalten. |
Objektnachrichten mit Mediationen | ||
Eine Objektnachricht wird an ein vermitteltes SIB-Ziel gesendet. | Nein | Wenn die Objektnachricht an ein vermitteltes Ziel gesendet wird, können durch die Aktivierung der Eigenschaft "producerDoesNotModifyPayloadAfterSet" keine Leistungsverbesserungen erzielt werden. |
Bytenachrichten mit Konsumentenanwendungen | ||
Eine Bytenachricht wird an eine beliebige Konsumentenanwendung gesendet. Die Eigenschaft "producerDoesNotModifyPayloadAfterSet" ist aktiviert. | Ja | Der Teil der JMS-Spezifikation, der das Kopieren der Daten voraussetzt, wenn sie in der Nachricht festgelegt werden, wird umgangen, und es wird eine Kopie der Bytedaten gespeichert. |
Eine Bytenachricht wird empfangen, und die Eigenschaft "consumerDoesNotModifyPayloadAfterGet" ist aktiviert. | Nein | Die JMS-API lässt nicht zu, dass Bytedaten nach Referenz zurück an den Konsumentencode übergeben wird (Methoden "BytesMessage.readBytes"). |
Eine Bytenachricht wird von mehreren Konsumenten empfangen (Topic), für die alle die Eigenschaft "consumerDoesNotModifyPayloadAfterGet" aktiviert ist. | Nein | Die JMS-API lässt nicht zu, dass Bytedaten nach Referenz zurück an den Konsumentencode übergeben wird (Methoden "BytesMessage.readBytes"). |
Bytenachrichten mit Weiterleitungsanwendungen | ||
Eine Bytenachricht wird weitergeleitet. | Nein | Es können keinerlei Leistungsverbesserungen durch die Aktivierung der Eigenschaften für die "Übergabe von Nachrichtennutzdaten nach Referenz" erzielt werden. |