メッセージ・フォーマット間のトランスコーディング
メディエーションは、メッセージの意味を変えることなくメッセージを別のフォーマットに変換することができます。 この操作は、メッセージのトランスコーディングと呼ばれます。
以下のコードは、メッセージを新しいメッセージ・フォーマットにトランスコードするメディエーション・ハンドラーの例です。
メッセージがトランスコード可能であることが前提です。
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;
}
}
下の表では、トランスコード可能なメッセージと、各フォーマット・ペアの結果を示しています。DG は「data graph」の省略形です。
表の大括弧内の数値の意味は、以下のとおりです。
- (1) JMS: フォーマットのメッセージは、ペイロードを含むことはできません。 メッセージ・プロパティー以外のメッセージ・データを含むことはできません。 メディエーションによって JMS: フォーマットのメッセージに対して getDataGraph() が呼び出されると、常に NULL が返されます。 他のすべてのメッセージ・フォーマットには、メッセージ・ペイロードが含まれる必要があります。 つまり、JMS: フォーマットのメッセージを他のフォーマットにトランスコードすることはできません。 メディエーションで JMS: フォーマットのメッセージを別のフォーマットのメッセージに変更する必要がある場合は、 SIMessage オブジェクトに対して SIDataGraphFactory.getInstance().createDataGraph(newFormat) メソッドおよび setDataGraph メソッドを呼び出して、メッセージの内容を変更する必要があります。
- (2) メディエーションによって JMS: フォーマットのメッセージに対して getDataGraph() が呼び出されると、 常に NULL が返されます。
- (3) メディエーションでメッセージに対して getNewDataGraph() メソッドを呼び出すことで、 元のメッセージと同じフォーマットを持つデータグラフのコピーを取得できます。 元のメッセージは変更せずに、コピーを編集することができます。SOAP および Bean の場合、「:」に続く値を変更するように書式制御ストリングを編集することによって、メッセージ・モデルを変更することができます。
JMS: へ | JMS:text へ | JMS:bytes へ | JMS:stream へ | JMS:object へ | SOAP: へ | Bean: へ | |
---|---|---|---|---|---|---|---|
JMS: から | DG=null (1) | DG=null (1) | DG=null (1) | DG=null (1) | DG=null (1) | DG=null (1) | DG=null (1) |
JMS:text から | DG=null (2) | はい (3) | はい、バイトは UTF-8 を含みます。 | はい、正しいスキーマに準拠している XML がテキストに含まれている場合。 | いいえ | はい、メッセージのコンテンツが有効な SOAP の場合。 | はい、メッセージのコンテンツが有効な SOAP の場合。 |
JMS:bytes から | DG=null (2) | はい、ただし、バイトが UTF-8 ストリングとして正しく解釈できる場合のみ。 | はい (3) | はい、正しいスキーマに準拠している XML がバイトに含まれている場合。 | はい、バイトがシリアライズド・オブジェクトであることが前提。 | はい、メッセージのコンテンツが有効な SOAP の場合。 | はい、メッセージのコンテンツが有効な SOAP の場合。 |
JMS:stream から | DG=null (2) | はい、テキストが XML トランスコーディングの場合。 | はい、バイトが XML トランスコーディングを含む場合。 | はい (3) | いいえ | いいえ | いいえ |
JMS:object から | DG=null (2) | いいえ | はい、バイトがオブジェクト・シリアライゼーションを含む場合。 | いいえ | はい (3) | いいえ | いいえ |
SOAP: から | DG=null (2) | はい | はい | いいえ | いいえ | はい (3) - メッセージのコンテンツが新規 WSDL に一致する場合。 | はい |
Bean: から | DG=null (2) | はい | はい | いいえ | いいえ | はい | はい (3) - メッセージのコンテンツが新規 WSDL に一致する場合。 |