Transmitir carga útil da mensagem por referência: Utilizar cenários e códigos de exemplo para aplicativos de redirecionamento
Um aplicativo redirecionador de JMS recebe uma mensagem (por meio de um connection factory ou, se ele for um bean acionado por mensagens, por meio de uma especificação de ativação) e envia o objeto da mensagem para outro destino. Explore os diferentes cenários de uso e, em seguida, codifique seus aplicativos de transmissão JMS para que possam transmitir com segurança as cargas úteis por referência ao transmitir mensagens de uma fila para outra dentro de um único servidor.
Quando grandes mensagens de objetos ou mensagens de bytes são enviadas, o custo no uso da memória e do processador de serialização, desserialização e cópia da carga útil da mensagem pode ser expressivo. Se você ativar as propriedades transmitir carga útil de mensagem por referência em um connection factory ou uma especificação de ativação, informará ao provedor do sistema de mensagens padrão para substituir a especificação do JMS 1.1 e reduzir ou ignorar potencialmente essa cópia de dados.
Na seguinte figura, as mensagens são transmitidas da queue1 em um mecanismo do sistema de mensagens, por meio da especificação de ativação ou do connection factory do cliente, para um aplicativo de encaminhamento JMS. Elas são então encaminhadas por meio do connection factory do produtor para a queue2 no mesmo mecanismo do sistema de mensagens.

- Um aplicativo de transmissão não substitui o objeto da mensagem. Isso será útil se o seu aplicativo estiver apenas registrando ou então gravando (por exemplo, imprimindo) a mensagem antes de transmiti-la e significa também que a mensagem transmitida retém algumas propriedades úteis da mensagem, como as propriedades JMSCorrelationID, JMSReplyTo e JMSType.
- Um aplicativo de transmissão pode modificar ou substituir a carga útil da mensagem. Se substituir a carga útil, configurará a nova carga útil do objeto de mensagem e alterará a referência da carga útil de modo a apontar para a nova carga útil da mensagem.
- Para um aplicativo de encaminhamento, a mensagem encaminhada é "criada" e configurada pelo connection factory do consumidor ou especificação de ativação. O connection factory do consumidor é utilizado unicamente para rotear a mensagem transmitida e não tem efeito no conteúdo da mensagem transmitida.
A tabela a seguir descreve os quatro cenários de uso do aplicativo de encaminhamento que afetam o modo de configuração das propriedades "passar carga útil da mensagem pela referência". Observe que, como o connection factory do produto não tem efeito sobre o conteúdo da mensagem transmitida, você define as propriedades do consumidor e do produtor/transmissor no connection factory do consumidor ou na especificação de ativação.
Cenário de uso do aplicativo de transmissão | consumerDoesNotModify |
producerDoesNotModify forwarderDoesNotModify |
---|---|---|
Cenário 1: O aplicativo recebe uma mensagem, consulta a carga útil mas não a modifica e encaminha a mensagem sem modificar ou substituir a carga útil. | Ativado | Não necessária, mas pode ser ativada |
Cenário 2: O aplicativo recebe uma mensagem, consulta a carga útil mas não a modifica, substitui a carga útil na mensagem por uma nova e encaminha a mensagem sem modificar a carga útil, após a chamada para configurá-la na mensagem. | Ativado | Ativado |
Cenário 3: O aplicativo recebe uma mensagem, consulta e modifica a carga útil, então configura a carga útil modificada ou alguns outros dados na mensagem e encaminha a mensagem sem modificar ainda mais a carga útil, após a chamada para configurá-la na mensagem. | NÃO ativada | Ativado |
Cenário 4: O aplicativo recebe uma mensagem, consulta e modifica a carga útil, então configura a carga útil modificada ou alguns outros dados na mensagem, em seguida modifica a carga útil após a chamada para configurá-la na mensagem. | NÃO ativada | NÃO ativada |
Para os cenários 1, 2 e 3, é possível ativar uma ou mais das propriedades "passar carga útil da mensagem por referência", contanto que o aplicativo de encaminhamento possa garantir que o comportamento seja igual ao descrito no cenário. Para ajudá-lo a conseguir isso, aqui está algum código de exemplo que é possível adaptar para utilizar em seus aplicativos.
Aplicativo de transmissão: cenário 1
O aplicativo recebe uma mensagem, consulta a carga útil, mas não a modifica, e transmite a mensagem sem modificar ou substituir a carga útil.
public void onMessage (Message message)
{
ObjectMessage oMessage = (ObjectMessage) message;
DataObject data = oMessage.getObject();
System.out.print(data.getXXX());
System.out.print(data.getYYY());
// get a session to forward on the received message
producer.send(message);
session.close();
}
Aplicativo de transmissão: cenário 2
O aplicativo recebe uma mensagem, consulta a carga útil, mas não a modifica, substitui a carga útil na mensagem por uma nova carga útil e transmite a mensagem sem modificar a carga útil após a chamada para configurá-la na mensagem.
public void onMessage(Message message)
{
ObjectMessage oMessage = (ObjectMessage) message;
DataObject data = oMessage.getObject();
System.out.print(data.getXXX());
System.out.print(data.getYYY());
// get a session to forward on the received message
message.setObject(newData);
producer.send(message);
session.close();
}
Para mensagens de bytes, seu aplicativo deve garantir a gravação de uma única matriz de byte completa na mensagem.byte [] data = myByteData;
BytesMessage message = session.createBytesMessage();
message.writeBytes(data);
data = null;
producer.send(message);
Aplicativo de transmissão: cenário 3
O aplicativo recebe uma mensagem, consulta e modifica a carga útil, então configura a carga útil modificada ou alguns outros dados na mensagem e encaminha a mensagem sem modificar ainda mais a carga útil, após a chamada para configurá-la na mensagem.
public void onMessage(Message message)
{
ObjectMessage oMessage = (ObjectMessage) message;
DataObject data = oMessage.getObject();
System.out.print(data.getXXX());
System.out.print(data.getYYY());
// get a session to forward on the received message
data.setXXX(xxx);
data.setYYY(yyy);
message.setObject(data);
producer.send(message);
session.close();
}
Para mensagens de bytes, seu aplicativo deve garantir a gravação de uma única matriz de byte completa na mensagem.byte [] data = myByteData;
BytesMessage message = session.createBytesMessage();
message.writeBytes(data);
data = null;
producer.send(message);