Sie können die Nutzdaten von Nachrichten in einem bereits vorhandenen
Mediationshandler bearbeiten und diese Daten von einem Nachrichtenformat in ein anderes konvertieren.
Informationen zu diesem Vorgang
Sie können diese Task verwenden, um die folgenden Aktionen für die Nutzdaten von Nachrichten auszuführen:
- Datenobjekte in den Nutzdaten von Nachrichten suchen
- Nutzdaten in ein anderes Format konvertieren
- Nutzdaten in eine Bytefeldgruppe konvertieren, z. B., wenn die Mediation Nachrichten protokollieren soll
Verwenden Sie für die Bearbeitung von Nachrichteninhalten die Anwendungsprogrammierschnittstellen "SIMessage" und "SIMessageContext".
Mit d"SIMediationSession" können Sie der Mediation Zugriff auf den
Service Integration Bus geben, um Nachrichten senden und empfangen zu können.
Nähere Informationen finden Sie in den folgenden Artikeln:
Zur
Bearbeitung bestimmter Felder in einer Nachricht verwenden Sie
SDO-Datengraphen (Service Data Objects) der Version 1.`
Weitere Informationen hierzu finden Sie im Artikel SDO-Datengraphen.
Nähere Informationen zum Format der unterstützten Nachrichtentypen und Beispiele für die Bearbeitung finden Sie im Artikel
Zuordnung von SDO-Datengraphen für Web-Service-Nachrichten.
Führen Sie zum Bearbeiten der Nutzdaten von Nachrichten
die folgenden Schritte aus:
Vorgehensweise
- Suchen Sie die Stelle in Ihrem Mediationshandler, an der Sie
den funktionierende Mediationscode in der Methode handle (MessageContext context) einfügen möchten. Die Schnittstelle ist "MessageContext". Setzen Sie diese Schnittstelle nur dann in einen SIMessageContext um, wenn Sie die
vom MessageContext bereitgestellten Methoden verwenden möchten.
- Rufen Sie den Datengraphen für die Nutzdaten von Nachrichten wie folgt ab:
- Rufen Sie die SIMessage aus dem MessageContext-Objekt ab. Beispiel:
SIMessage message = ((SIMessageContext)context).getSIMessage();
- Rufen Sie die Nachrichtenformatzeichenfolge ab, um den Typ zu bestimmen. Beispiel:
String messageFormat = message.getFormat();
- Rufen Sie das DataGraph-Objekt aus der Nachricht ab. Beispiel:
DataGraph dataGraph = message.getDataGraph();
Weitere Informationen
finden Sie im Artikel SDO-Datengraphen.
- Optional: Suchen Sie Datenobjekte in den Nutzdaten:
- Navigieren Sie in dem Graphen zu einem benannten DataObject. Beispiel: DataObject hat den Namen "data":
DataObject dataObject = dataGraph.getRootObject().getDataObject("data");
- Rufen Sie die Informationen aus dem Datenobjekt ab. Beispiel: Die Nachricht ist eine Textnachricht:
String textInfo = dataObject.getString("value");
- Bearbeiten Sie die Felder in der Nachricht. Ein diesbezügliches Beispiel finden Sie im Artikel Beispielcode für Nachrichtenfelder.
- Optional: Gehen Sie zum Konvertieren der Nutzdaten
in ein anderes Format wie folgt vor:
- Lesen Sie den Artikel Codeumsetzung zwischen Nachrichtenformaten, um sich mit den Auswirkungen
der Formatkonvertierung vertraut zu machen.
- Rufen Sie die Methode getNewDataGraph auf und übergeben Sie das neue Format als
Parameter. Daraufhin wird eine Kopie der Nutzdaten im neuen Format zurückgegeben. Beispiel:
DataGraph newDataGraph = message.getNewDataGraph(newFormat);
- Schreiben Sie den Datengraphen im neuen Format mit der Methode "setDataGraph" zurück in die Nachricht. Beispiel:
message.setDataGraph(newDataGraph, newFormat);
- Optional: Konvertieren Sie die Nutzdaten wie folgt in einen Bytestrom:
- Lesen Sie die Artikel Nutzdaten einer Nachricht in eine Bytefeldgruppe umsetzen und Bytefeldgruppe in Nutzdaten einer Nachricht umsetzen, um sich mit den Auswirkungen der Konvertierung vom Nachrichtenformat in
einen Bytestrom und umgekehrt vertraut zu machen.
- Rufen Sie die Methode "getDataGraphAsBytes" auf, die eine Kopie der Nutzdaten in Form eines Bytestroms zurückgibt. Beispiel:
byte[] newByteArray = message.getDataGraphAsBytes();
- Rufen Sie die Methode "createDataGraph" der API "SIDataGraphFactory"
auf, die einen neuen Datengraphen erstellt, indem sie die Bytes entsprechend des an die Methode übergebenen Formats syntaktisch analysiert. Beispiel:
DataGraph newDataGraph = SIDataGraphFactory.getInstance().createDataGraph( byteArray, format);
- Bearbeiten Sie die Nachricht als Bytestrom. Ein diesbezügliches Beispiel finden Sie im Artikel Beispielcode für Nachrichtenfelder.
- Geben Sie True in Ihrem Mediationscode zurück, damit der MessageContext an den nächsten
Mediationshandler in der Handlerliste übergeben wird. Wenn der Rückgabewert False ist, wird der MessageContext verworfen und dem Ziel nicht
zugestellt.
Anmerkung: Falls Ihr Mediationshandler der letzte Handler in der Liste und der Routing-Pfad leer ist, wird die Nachricht den konsumierenden
Anwendungen an diesem Ziel zur Verfügung gestellt.
Wenn der Routing-Pfad nicht leer ist, wird die Nachrichten keinen Konsumenten an dieses Ziel zur
Verfügung gestellt.
Stattdessen wird die Nachricht an das nächste Ziel im Routing-Pfad weitergeleitet.
Beispielcode für Nachrichtenfelder
public boolean handle(MessageContext context) throws MessageContextException {
/* SIMessage aus dem MessageContext-Objekt abrufen */
SIMessage message = ((SIMessageContext)context).getSIMessage();
/* Nachrichtenformatzeichenfolge abrufen */
String messageFormat = message.getFormat();
/* Für eine JMS-Textnachricht den in der Nachricht enthaltenen Text extrahieren */
if(messageFormat.equals("JMS:text"))
{
/* Das DataGraph-Objekt aus der Nachricht abrufen */
DataGraph dataGraph = message.getDataGraph();
/* Im Datengraphen zum DataObject 'data' navigieren */
DataObject dataObject = dataGraph.getRootObject().getDataObject("data");
/* Die im DataObject enthaltenen Textinformationen abrufen */
String textInfo = dataObject.get("value");
/* Die abgerufenen Textinformationen verwenden */
System.out.println(textInfo);
}
/* True zurückgeben, damit der MessageContext an weitere Mediationshandler
* in der Handlerliste übergeben wird */
return true;
}
Der vollständige Mediationsfunktionscode für die Bearbeitung von Nachrichtennutzdaten
als Bytestrom kann wie folgt aussehen:
public boolean handle(MessageContext context) throws MessageContextException {
/* SIMessage aus dem MessageContext-Objekt abrufen */
SIMessage message = ((SIMessageContext)context).getSIMessage();
if (!SIApiConstants.JMS_FORMAT_MAP.equals(msg.getFormat()))
{
try
{
dumpBytes(msg.getDataGraphAsBytes());
}
catch (Exception e)
{
System.out.println("Der Nachrichteninhalt konnte nicht abgerufen werden:"+e);
}
}
else
{
System.out.println("Die Bytes für eine JMS:map-Nachricht können nicht angezeigt werden.");
;
}
return true;
}
private static void dumpBytes(byte[] bytes)
{
// Subroutine zum Ausgeben der Bytes in einer lesbaren Form in System.out
}
}