Übergabe von Nachrichtennutzdaten nach Referenz: Einsatzszenarien und Beispielcode für Weiterleitungsanwendungen

Eine JMS-Weiterleitungsanwendung empfängt eine Nachricht (über eine Verbindungsfactory bzw. eine Aktivierungsspezifikation, falls die Anwendung eine nachrichtengesteuerte Bean (MDB, Message-driven Bean) ist, und sendet das Nachrichtenobjekt anschließend an ein anderes Ziel. Arbeiten Sie die verschiedenen Einsatzszenarien durch und codieren Sie anschließend Ihre JMS-Weiterleitungsanwendungen so, dass Sie Nachrichtennutzdaten sicher nach Referenz übergeben können, wenn Nachrichten von einer Warteschlange an eine andere in einem einzigen Server weitergeleitet werden.

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.

In der folgenden Abbildungen werden Nachrichten von der Warteschlange "queue1" in einer Messaging-Engine über eine Konsumentenaktivierungsspezifikation oder Konsumentenverbindungsfactory an eine JMS-Weiterleitungsanwendung übergeben. Die Nachrichten werden anschließend über eine Verbindungsfactory eines Erzeugers an die Warteschlange "queue2" in derselben Messaging-Engine weitergeleitet.

Vorsicht:
Die Teile der JMS-Spezifikation, die von diesen Eigenschaften umgangen werden, werden definiert, um die Integrität der Nachrichtendaten zu gewährleisten. Alle JMS-Anwendungen, die diese Eigenschaften verwenden, müssen die Regeln, die im Folgenden beschrieben sind, strikt einhalten, da die Datenintegrität ansonsten nicht gewährleistet werden kann.
Abbildung 1. Nachrichten weiterleiten
Die Abbildung veranschaulicht den Nachrichtenfluss von einer Warteschlange zu einer anderen. Von der Warteschlange "queue1" werden die Nachrichten über die Konsumentenaktivierungsspezifikation oder die Eigenschaft der Konsumentenverbindungsfactory an die JMS-Weiterleitungsanwendung übergeben. Von der JMS-Weiterleitungsanwendung werden die Nachrichten dann über die Eigenschaft der Erzeugerverbindungsfactory an die Warteschlange "queue2" weitergeleitet.
Um die Einsatzszenarien und den zugehörigen Beispielcode in diesem Artikel verstehen zu können, müssen Sie die folgenden wichtigen Eigenschaften einer JMS-Weiterleitungsanwendung kennen:
  • Eine Weiterleitungsanwendung ersetzt das Nachrichtenobjekt nicht. Dies ist hilfreich, wenn Ihre Anwendung die Nachricht vor der Weiterleitung nur protokolliert oder anderweitig aufzeichnet (z. B. ausdruckt). Gleichzeitig bedeutet dies auch, dass die weitergeleitete Nachricht verschiedene wichtige Nachrichteneigenschaften, wie z. B. die Eigenschaften JMSCorrelationID, JMSReplyTo und JMSType, beibehält.
  • Eine Weiterleitungsanwendung kann die Nachrichtennutzdaten ändern oder ersetzen. Wenn sie die Nutzdaten ersetzt, definiert sie die neuen Nutzdaten im Nachrichtenobjekt und ändert die Nutzdatenreferenz so, dass sie auf die neuen Nachrichtennutzdaten verweist.
  • Für eine Weiterleitungsanwendung wird die weitergeleitete Nachricht von der Verbindungsfactory oder Aktivierungsspezifikation des Konsumenten "erstellt" und konfiguriert. Die Verbindungsfactory des Erzeugers wird lediglich dazu verwendet, die Nachricht weiterzuleiten, und hat keinen Einfluss auf den Inhalt der weitergeleiteten Nachricht.

In der folgenden Tabelle sind die vier Einsatzszenarien für Weiterleitungsanwendungen beschrieben, die bestimmen, wie Sie die Eigenschaften für die "Übernahme von Nachrichtennutzdaten nach Referenz" definieren. Da die Verbindungsfactory des Erzeugers keinen Einfluss auf den Inhalt der weitergeleiteten Nachricht hat, definieren Sie die Eigenschaften der Konsumentenanwendung und die Eigenschaften der Erzeuger-/Weiterleitungsanwendung in der Verbindungsfactory oder Aktivierungsspezifikation des Konsumenten.

Tabelle 1. Auswirkungen der Eigenschaften für die "Übergabe von Nachrichtennutzdaten nach Referenz" auf die Weiterleitungsanwendungen - Einsatzszenarien. In der ersten Spalte der Tabelle sind die vier Einsatzszenarien für Weiterleitungsanwendungen beschrieben. Die zweite Spalte zeigt die Einstellung der Konsumenteneigenschaft für die Szenarien an. Die dritte Spalte zeigt die Einstellung der Verbindungseigenschaft bzw. der Aktivierungsspezifikationseigenschaft für die Szenarien an.
Einsatzszenarien für Weiterleitungsanwendung

consumerDoesNotModify
PayloadAfterGet

Eigenschafteneinstellung

producerDoesNotModify
PayloadAfterSet

Eigenschafteneinstellung (für Verbindungsfactorys) oder

forwarderDoesNotModify
PayloadAfterSet

Eigenschafteneinstellung (für Aktivierungsspezifikationen)
Szenario 1: Die Anwendung empfängt eine Nachricht, untersucht die Nutzdaten, ändert sie aber nicht und leitet die Nachricht dann ohne Änderung oder Ersetzung der Nutzdaten weiter. Aktiviert Nicht erforderlich, kann aber aktiviert werden
Szenario 2: Die Anwendung empfängt eine Nachricht, untersucht die Nutzdaten, ändert sie aber nicht, ersetzt die Nutzdaten in der Nachricht durch neue Nutzdaten und leitet die Nachricht dann ohne Änderung der Nutzdaten nach dem Aufruf zum Festlegen der Nutzdaten in der Nachricht weiter. Aktiviert Aktiviert
Szenario 3: Die Anwendung empfängt eine Nachricht, untersucht und ändert die Nutzdaten und definiert dann die geänderten Nutzdaten oder andere Daten in der Nachricht und leitet die Nachricht anschließend ohne weitere Änderung der Nutzdaten nach dem Aufruf zum Definieren der Daten in der Nachricht weiter. Nicht aktiviert Aktiviert
Szenario 4: Die Anwendung empfängt eine Nachricht, untersucht und ändert die Nutzdaten, stellt die geänderten Nutzdaten oder andere Daten in die Nachricht zurück und führt dann nach dem Aufruf zum Festlegen der Nutzdaten in der Nachricht weitere Änderungen durch. Nicht aktiviert Nicht aktiviert

Für die Szenarien 1, 2 und 3 können Sie eine oder mehrere Eigenschaften für die "Übernahme von Nutzdaten nach Referenz" aktivieren, sofern sich die Weiterleitungsanwendung garantiert so verhält, wie es im Szenario beschrieben ist. Verwenden Sie hierfür den folgenden Beispielcode, den Sie für die Verwendung in Ihren Anwendungen anpassen können.

Weiterleitungsanwendung: Szenario 1

Die Anwendung empfängt eine Nachricht, untersucht die Nutzdaten, ändert sie aber nicht und leitet die Nachricht dann ohne Änderung oder Ersetzung der Nutzdaten weiter.

public void onMessage (Message message)
{
   ObjectMessage oMessage = (ObjectMessage) message;
   DataObject data = oMessage.getObject();
   System.out.print(data.getXXX());
   System.out.print(data.getYYY());

   // Sitzung zur Weiterleitung der empfangenen Nachricht abrufen
   
   producer.send(message);
   session.close();
}

Weiterleitungsanwendung: Szenario 2

Die Anwendung empfängt eine Nachricht, untersucht die Nutzdaten, ändert sie aber nicht, ersetzt die Nutzdaten in der Nachricht durch neue Nutzdaten und leitet die Nachricht dann ohne Änderung der Nutzdaten nach dem Aufruf zum Festlegen der Nutzdaten in der Nachricht weiter.

public void onMessage(Message message)
{
   ObjectMessage oMessage = (ObjectMessage) message;
   DataObject data = oMessage.getObject();
   System.out.print(data.getXXX());
   System.out.print(data.getYYY());

   // Sitzung zur Weiterleitung der empfangenen Nachricht abrufen
   
   message.setObject(newData);

   producer.send(message);
   session.close();
}
Für Bytenachrichten muss Ihre Anwendung außerdem garantieren, dass nur eine einzige vollständige Bytefeldgruppe in die Nachricht geschrieben wird.
byte [] data = myByteData; 
BytesMessage message = session.createBytesMessage(); 
message.writeBytes(data); 
data = null;	 
producer.send(message);

Weiterleitungsanwendung: Szenario 3

Die Anwendung empfängt eine Nachricht, untersucht und ändert die Nutzdaten und definiert dann die geänderten Nutzdaten oder andere Daten in der Nachricht und leitet die Nachricht anschließend ohne weitere Änderung der Nutzdaten nach dem Aufruf zum Definieren der Daten in der Nachricht weiter.

public void onMessage(Message message)
{
   ObjectMessage oMessage = (ObjectMessage) message;
   DataObject data = oMessage.getObject();
   System.out.print(data.getXXX());
   System.out.print(data.getYYY());

   // Sitzung zur Weiterleitung der empfangenen Nachricht abrufen

   data.setXXX(xxx);
   data.setYYY(yyy);
   message.setObject(data);

   producer.send(message);
   session.close();
}
Für Bytenachrichten muss Ihre Anwendung außerdem garantieren, dass nur eine einzige vollständige Bytefeldgruppe in die Nachricht geschrieben wird.
byte [] data = myByteData; 
BytesMessage message = session.createBytesMessage(); 
message.writeBytes(data); 
data = null;	 
producer.send(message);

Symbol, das den Typ des Artikels anzeigt. Konzeptartikel



Symbol für Zeitmarke Letzte Aktualisierung: 25.05.2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=cjn_passbyref_forward
Dateiname:cjn_passbyref_forward.html