Codeumsetzung zwischen Nachrichtenformaten
Eine Mediation kann eine Nachricht von einem Format in ein anderes konvertieren, ohne die semantische Bedeutung der Nachricht zu ändern. Diese Operation wird als Codeumsetzung einer Nachricht bezeichnet.
Der folgende Code ist ein Beispielmediationshandler, der die Codeumsetzung einer Nachricht in ein neues Nachrichtenformat
durchführt, sofern die Nachricht dies unterstützt:
private static final String NEW_FORMAT = "JMS:text";
public boolean(MessageContext context) throws MessageContextException
{
try
{
SIMessageContext msgCtx = (SIMessageContext)context;
SIMessage msg = msgCtx.getMessage();
DataGraph newDg = msg.getNewDataGraph(NEW_FORMAT);
msg.setDataGraph(newDg,NEW_FORMAT);
return true;
}
catch (Exception e)
{
// Reroute the original message to the exception destination
MessageContextException mce =
new MessageContextException("Unable to transcode to "+NEW_FORMAT",e);
throw mce;
}
}
In der folgenden Tabelle wird beschrieben, für welche Nachrichten eine Codeumsetzung durchgeführt werden kann.
Außerdem wird das Ergebnis jeder Formatpaarung angegeben. Die Abkürzung DG steht für "Datengraph".
Die Zahlen in eckigen Klammern, die in der Tabelle verwendet werden, sind im Folgenden erläutert:
- (1) Eine Nachricht mit dem Format JMS: kann keine Nutzdaten haben. Sie enthält abgesehen von den Nachrichteneigenschaften keine weiteren Nachrichtendaten. Wenn eine Mediation getDataGraph() für eine Nachricht mit dem Format JMS: aufruft, wird immer null zurückgegeben. Alle anderen Nachrichtenformate müssen Nachrichtennutzdaten haben. Das bedeutet, dass für eine Nachricht mit dem Format JMS: keine Codeumsetzung in ein anderes Format durchgeführt werden kann. Wenn eine Mediation eine Nachricht mit dem Format JMS: in eine Nachricht mit einem anderen Format ändern muss, muss die Mediation die Methoden SIDataGraphFactory.getInstance().createDataGraph(newFormat) und setDataGraph für das SIMessage-Objekt aufrufen, um den Nachrichteninhalt zu ändern.
- (2) Es wird immer null zurückgegeben, wenn eine Mediation getDataGraph() für eine Nachricht mit dem Format JMS: aufruft.
- (3) Eine Mediation kann die Methode "getNewDataGraph()" für eine Nachricht aufrufen, um eine Datengraphkopie zurückzugeben, die dasselbe Format wie die Nachricht hat. Die Kopie kann bearbeitet werden, womit die ursprüngliche Nachricht unverändert bleibt. Für SOAP und Beans können Sie das Nachrichtenmodell ändern, indem Sie die Formatierzeichenfolge editieren und den Wert ändern, der dem Doppelpunkt (":") folgt.
In JMS: | In JMS:text | In JMS:bytes | In JMS:stream | In JMS:object | In SOAP: | In Bean: | |
---|---|---|---|---|---|---|---|
Von JMS: | DG=null (1) | DG=null (1) | DG=null (1) | DG=null (1) | DG=null (1) | DG=null (1) | DG=null (1) |
Von JMS:text | DG=null (2) | Ja (3) | Ja, Bytes enthalten UTF-8 | Ja, sofern der Text gemäß Schema gültige XML enthält | Nein | Ja, sofern der Nachrichteninhalt für SOAP gültig ist | Ja, sofern der Nachrichteninhalt für SOAP gültig ist |
Von JMS:bytes | DG=null (2) | Ja, aber nur, wenn die Bytes problemlos als UTF-8-Zeichenfolge interpretiert werden können | Ja (3) | Ja, sofern die Bytes gemäß Schema gültige XML enthalten | Ja, sofern die Bytes ein serialisiertes Objekt sind | Ja, sofern der Nachrichteninhalt für SOAP gültig ist | Ja, sofern der Nachrichteninhalt für SOAP gültig ist |
Von JMS:stream | DG=null (2) | Ja, Text ist eine XML-Codeumsetzung | Ja, Bytes enthalten XML-Codeumsetzung | Ja (3) | Nein | Nein | Nein |
Von JMS:object | DG=null (2) | Nein | Ja, Bytes enthalten serialisiertes Objekt | Nein | Ja (3) | Nein | Nein |
Von SOAP: | DG=null (2) | Ja | Ja | Nein | Nein | Ja (3), sofern der Nachrichteninhalt der neuen WSDL entspricht | Ja |
Von Bean: | DG=null (2) | Ja | Ja | Nein | Nein | Ja | Ja (3), sofern der Nachrichteninhalt der neuen WSDL entspricht |