在訊息格式之間轉碼
調解可以將訊息從一種格式轉換成另一種格式,而不需要變更訊息的語意意義。 此作業稱為轉碼訊息。
下列程式碼是調解處理程式範例,它會將訊息轉碼成新的訊息格式,但前提是訊息可以轉碼:
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 代表「資料圖形」。 表格中括弧內的數字說明如下:
- (1) 格式為 JMS 的訊息不能有有效負載。 它不包含訊息內容以外的任何訊息資料。 如果調解對 JMS 格式的訊息呼叫 getDataGraph() : ,null一律會傳回。 所有其他訊息格式必須具有訊息有效負載。 這表示 JMS: 格式的訊息無法轉碼成另一個格式。 如果調解需要將 JMS 格式的訊息變更為任何其他格式的訊息,調解需要呼叫 SIMessage 物件上的 SIDataGraphFactory.getInstance().createDataGraph(newFormat) 和 setDataGraph 方法來變更訊息內容。
- (2)null如果調解在 JMS 格式的訊息上呼叫 getDataGraph() ,則一律會傳回:
- (3) 調解可以對訊息呼叫 getNewDataGraph() 方法,以傳回與訊息格式相同的複製資料圖。 可以編輯副本,保留原始訊息不變。 如果是 SOAP 和 Bean ,您可以編輯格式字串來變更訊息模型,以變更 ":" 後面的值。
| 至 JMS: | 至 JMS: 文字 | 至 JMS: 位元組 | 至 JMS: 串流 | 至 JMS: 物件 | 至 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: 文字 | DG=null (2) | 是 (3) | 是,位元組包含 UTF-8 | 是,如果文字包含符合正確綱目的 XML。 | 否 | 是,如果訊息內容是有效的 SOAP。 | 是,如果訊息內容是有效的 SOAP。 |
| 來源 JMS: 位元組 | DG=null (2) | 是,但只有在位元組可以正確解譯為 UTF-8 字串時。 | 是 (3) | 是,如果位元組包含符合正確綱目的 XML。 | 是,假設位元組是序列化物件。 | 是,如果訊息內容是有效的 SOAP。 | 是,如果訊息內容是有效的 SOAP。 |
| 從 JMS: 串流 | DG=null (2) | 是,文字是 XML 轉碼。 | 是,位元組包含 XML 轉碼。 | 是 (3) | 否 | 否 | 否 |
| 來源 JMS: 物件 | DG=null (2) | 否 | 是,位元組包含物件序列化。 | 否 | 是 (3) | 否 | 否 |
| 從 SOAP: | DG=null (2) | 是(Y) | 是(Y) | 否 | 否 | 是 (3)-如果訊息內容符合新的 WSDL。 | 是(Y) |
| 從 Bean: | DG=null (2) | 是(Y) | 是(Y) | 否 | 否 | 是(Y) | 是 (3)-如果訊息內容符合新的 WSDL。 |