Transcodificación entre formatos de mensaje
Una mediación puede convertir un mensaje de un formato en otro sin cambiar el significado semántico del mensaje. Esta operación se denomina transcodificación de un mensaje.
El código siguiente es un manejador de mediación de ejemplo que transcodifica un mensaje en un nuevo formato de mensaje, siempre que el mensaje se pueda transcodificar:
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)
{
// Redireccione el mensaje original al destino de excepciones
MessageContextException mce =
new MessageContextException("Unable to transcode to "+NEW_FORMAT",e);
throw mce;
}
}
En la tabla siguiente se describe qué mensajes se pueden transcodificar y proporciona la salida para cada par de formatos. Tenga en cuenta que la abreviatura DG representa "gráfico de datos". Los números indicados entre delimitadores en la tabla se describen así:
- (1) Un mensaje con JMS de formato: no puede tener una carga. No puede transportar ningún dato de mensaje que no sean las propiedades del mensaje. Si una mediación llama a getDataGraph() en un mensaje con formato JMS: siempre se devuelve null. Todos los demás formatos de mensajes deben tener una carga del mensaje. Esto significa que un mensaje con formato JMS: no se puede transcodificar en otro formato. Si una mediación necesita convertir un mensaje con formato JMS: en un mensaje con cualquier otro formato, la mediación debe llamar a los métodos SIDataGraphFactory.getInstance().createDataGraph(newFormat) y setDataGraph en el objeto SIMessage para cambiar el contenido del mensaje.
- (2) siempre se devuelve null si una mediación llama a getDataGraph() en un mensaje con formato JMS:
- (3) Una mediación puede llamar al método getNewDataGraph() en un mensaje para devolver un gráfico de datos de copia con el mismo formato que el mensaje. La copia se puede editar, dejando el mensaje original sin cambiar. Para SOAP y Beans, puede modificar el modelo del mensaje editando la serie de formato para cambiar el valor que sigue a “:”.
A JMS: | A JMS:text | A JMS:bytes | A JMS:stream | A JMS:object | A SOAP: | A Bean: | |
---|---|---|---|---|---|---|---|
Desde JMS: | DG=null (1) | DG=null (1) | DG=null (1) | DG=null (1) | DG=null (1) | DG=null (1) | DG=null (1) |
Desde JMS:text | DG=null (2) | Sí (3) | Sí, los bytes contienen UTF-8 | Sí, si el texto contiene XML que sea conforme al esquema correcto. | No | Sí, si el contenido del mensaje es SOAP válido. | Sí, si el contenido del mensaje es SOAP válido. |
Desde JMS:bytes | DG=null (2) | Sí, pero sólo cuando los bytes pueden interpretarse correctamente como una serie UTF-8. | Sí (3) | Sí, si los bytes contienen XML que sea conforme al esquema correcto. | Sí, se supone que los bytes son un objeto serializado. | Sí, si el contenido del mensaje es SOAP válido. | Sí, si el contenido del mensaje es SOAP válido. |
Desde JMS:stream | DG=null (2) | Sí, el texto es transcodificación de XML. | Sí, los bytes contienen transcodificación de XML. | Sí (3) | No | No | No |
Desde JMS:object | DG=null (2) | No | Sí, los bytes contienen la serialización de objeto. | No | Sí (3) | No | No |
Desde SOAP: | DG=null (2) | Sí | Sí | No | No | Sí (3) - si el contenido del mensaje coincide con el nuevo WSDL. | Sí |
Desde Bean: | DG=null (2) | Sí | Sí | No | No | Sí | Sí (3) - si el contenido del mensaje coincide con el nuevo WSDL. |