Ü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.

- 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.
Einsatzszenarien für Weiterleitungsanwendung | consumerDoesNotModify |
producerDoesNotModify forwarderDoesNotModify |
---|---|---|
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);