在消息格式之间进行代码转换
调解可将消息从一种格式转换为另一种格式,而无需更改消息的语义。此操作称为对消息进行代码转换。
以下代码为对消息进行代码转换以将其转换为新消息格式的示例调解处理程序(假定消息可进行代码转换):
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) 如果调解对格式为 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) | 是 | 是 | 否 | 否 | Yes (3) - 如果消息内容匹配新 WSDL。 | 是 |
从 Bean: | DG=null (2) | 是 | 是 | 否 | 否 | 是 | Yes (3) - 如果消息内容匹配新 WSDL。 |