É possível trabalhar com a carga útil da mensagem em um manipulador de mediação preexistente e transcodificar a carga útil da mensagem de um formato de mensagem para outro.
Sobre Esta Tarefa
É possível usar essa tarefa para concluir algumas ou todas as ações a seguir na carga útil da mensagem:
- Localize os objetos de dados na carga útil da mensagem
- Converta a carga útil da mensagem em outro formato
- Converta a carga útil da mensagem em uma matriz de bytes, por exemplo se desejar que a mediação grave mensagens.
Para trabalhar com o conteúdo de uma mensagem, use as APIs SIMessage e SIMessageContext. Além disso, use SIMediationSession para permitir que a mediação acesse o barramento de integração de serviços, para enviar e receber mensagens. Para obter informações adicionais, consulte:
Para trabalhar com campos específicos em uma mensagem, use gráficos de dados de Objetos de Dados de Serviço (SDO) do Versão 1.
Para obter informações adicionais, consulte Gráficos de Dados SDO.
Para obter informações adicionais sobre o formato dos tipos de mensagens suportados e exemplos de como trabalhar com eles, consulte Mapeamento de Gráficos de Dados SDO para Mensagens de Serviços da Web.
Para trabalhar com a carga útil da mensagem, execute as seguintes etapas:
Procedimento
- Localize o ponto no manipulador de mediação no qual você insere
o código de mediação funcional, no método handle (Contexto MessageContext). A interface é MessageContext e deve ser convertida em SIMessageContext, a menos que você deseje trabalhar com os métodos fornecidos por MessageContext.
- Recupere o gráfico de dados da carga útil da mensagem, conforme a seguir:
- Obtenha o SIMessage a partir do objeto MessageContext. Por exemplo:
SIMessage message = ((SIMessageContext)context).getSIMessage();
- Obtenha a sequência do formato da mensagem para determinar seu tipo. Por exemplo:
String messageFormat = message.getFormat();
- Recupere o objeto DataGraph da mensagem. Por exemplo:
DataGraph dataGraph = message.getDataGraph();
Para obter informações adicionais, consulte o Gráficos de Dados SDO.
- Opcional: Localize objetos de dados na carga útil da mensagem:
- Navegue, no gráfico, para um DataObject nomeado. Por exemplo, em que DataObject possui o nome "data":
DataObject dataObject = dataGraph.getRootObject().getDataObject("data");
- Recupere as informações contidas no objeto de dados. Por exemplo, se a mensagem for uma mensagem de texto:
String textInfo = dataObject.getString("value");
- Trabalhe com os campos na mensagem. Para obter um exemplo de como fazer isso, consulte Código de Exemplo para Campos da Mensagem.
- Opcional: Transcodifique a carga útil em outro formato:
- Revise o tópico Transcodificação entre Formatos de Mensagens para entender as implicações da transcodificação da carga útil.
- Chame o método getNewDataGraph, passando o novo formato como um parâmetro, que retorna uma cópia da carga útil no novo formato. Por exemplo:
DataGraph newDataGraph = message.getNewDataGraph(newFormat);
- Grave o gráfico de dados no novo formato novamente na mensagem, usando o método setDataGraph. Por exemplo:
message.setDataGraph(newDataGraph, newFormat);
- Opcional: Converta a carga útil em um fluxo bytes:
- Revise os tópicos Transcodificação de uma Carga Útil da Mensagem em uma Matriz de Byte e Transcodificação de uma Matriz de Bytes em uma Carga Útil da Mensagem para entender as implicações da conversão entre o formato da mensagem e o fluxo de byte e vice-versa.
- Chame o método getDataGraphAsBytes, que retorna uma cópia da carga útil como um fluxo de byte. Por exemplo:
byte[] newByteArray = message.getDataGraphAsBytes();
- Chame o método createDataGraph, fornecido pela API SIDataGraphFactory, que cria um novo gráfico de dados, analisando os bytes de acordo com o formato passado para o método. Por exemplo:
DataGraph newDataGraph = SIDataGraphFactory.getInstance().createDataGraph( byteArray, format);
- Trabalhe com a mensagem como um fluxo de bytes. Para obter um exemplo de como fazer isso, consulte Código de Exemplo para Campos da Mensagem
- Retorne True no código de mediação para que o MessageContext seja passado para o próximo manipulador de mediação na lista de manipuladores. Se o valor de retorno for False o MessageContext será descartado e não será entregue para o destino.
Nota: Se o manipulador de mediação for o último manipulador da lista e o caminho de roteamento de encaminhamento estiver vazio, a mensagem será disponibilizada para aplicativos de consumo nesse destino. Se o caminho de roteamento de encaminhamento não estiver vazio, a mensagem não será disponibilizada para nenhum consumidor nesse destino. Em vez disso, a mensagem será encaminhada para o próximo destino no caminho de roteamento.
Código de Exemplo para Campos da Mensagem
public boolean handle(MessageContext context) throws MessageContextException {
/* Get the SIMessage from the MessageContext object */
SIMessage message = ((SIMessageContext)context).getSIMessage();
/* Get the message format string */
String messageFormat = message.getFormat();
/* If you have a JMS TextMessage then extract the text contained in the message. */
if(messageFormat.equals("JMS:text"))
{
/* Retrieve the DataGraph object from the message */
DataGraph dataGraph = message.getDataGraph();
/* Navigate down the DataGraph to the DataObject named 'data'. */
DataObject dataObject = dataGraph.getRootObject().getDataObject("data");
/* Retrieve the text information contained in the DataObject. */
String textInfo = dataObject.get("value");
/* Use the text information retrieved */
System.out.println(textInfo);
}
/* Return true so the MessageContext is passed to any other mediation handlers
* in the handler list */
return true;
}
O código de função completo para trabalhar com a carga útil da mensagem como um fluxo de bytes pode ser parecido com esse exemplo:
public boolean handle(MessageContext context)throws MessageContextException {
/* Get the SIMessage from the MessageContext object */
SIMessage message = ((SIMessageContext)context).getSIMessage();
if (!SIApiConstants.JMS_FORMAT_MAP.equals(msg.getFormat()))
{
try
{
dumpBytes(msg.getDataGraphAsBytes());
}
catch(Exception e)
{
System.out.println("The message contents could not be retrieved due to a "+e);
}
}
else
{
System.out.println("The bytes for a JMS:map format message cannot be shown.");
}
return true;
}
private static void dumpBytes(byte[] bytes)
{
// Subroutine to dump the bytes in a readable form to System.out
}
}