Por Que e Quando Transmitir a Carga Útil de Mensagens JMS por Referência

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.

Segundo Plano

A especificação JMS 1.1 determina que as mensagens de objeto sejam transmitidas pelo valor. Isso significa que um provedor JMS como o provedor de sistemas de mensagens padrão no WebSphere Application Server precisa obter uma cópia do objeto no ObjectMessage no momento em que o objeto é configurado na carga útil da mensagem, no caso em que o aplicativo cliente modifica o objeto depois de configurá-lo. Na prática, isso significa serializá-lo, pois não há nenhuma outra maneira totalmente segura de obter uma cópia. A especificação também determina que quando um aplicativo de consumidor obtém os dados da mensagem, o provedor JMS deve criar e retornar uma cópia desses dados.

Se você ativar as propriedades de "transmissão de carga útil da mensagem por referência", poderá obter melhorias de memória e desempenho para o sistema de mensagens JMS.

CUIDADO:
  • As partes da especificação JMS que são ignoradas por essas propriedades são definidas para garantir a integridade dos dados da mensagem.
  • Qualquer um dos aplicativos JMS que usar essas propriedades deverá seguir rigorosamente as regras descritas em detalhes posteriormente nesta seção ou você poderá perder a integridade de dados.
  • Você deve ler e compreender este tópico inteiro antes de ativar essas propriedades.
Para transmitir a carga útil da mensagem por referência, você configura as seguintes propriedades nos connection factories e nas especificações de ativação:
producerDoesNotModifyPayloadAfterSet (para connection factories) ou forwarderDoesNotModifyPayloadAfterSet (para especificações de ativação)
Quando essa propriedade estiver ativada, as mensagens de objeto ou de bytes produzidas pelo connection factory ou redirecionadas por meio da especificação de ativação não são copiadas quando configuradas na mensagem e são serializadas apenas quando absolutamente necessário. Os aplicativos que enviam tais mensagens não devem modificar os dados, uma vez que foram configurados na mensagem.
consumerDoesNotModifyPayloadAfterGet
Quando essa propriedade estiver ativada, as mensagens de objeto recebidas por meio do connection factory ou da especificação de ativação são serializadas apenas quando absolutamente necessário. Os dados obtidos a partir dessas mensagens não devem ser modificados pelos aplicativos.

Possíveis benefícios ao transmitir a carga útil da mensagem por referência

A tabela a seguir mostra as condições sob as quais você pode obter benefícios de desempenho, ativando as propriedades de "transmissão de carga útil da mensagem por referência". Esta tabela apresenta as seguintes hipóteses:
  • Seus aplicativos JMS adaptam-se às regras descritas na seção seguinte deste tópico.
  • Seus aplicativos de produtor e consumidor de mensagem são executados na mesma JVM (servidor), juntamente com o mecanismo do sistema de mensagens que hospeda o destino usado por esses aplicativos.
Nota:
  • Caso seus aplicativos sejam executados em servidores diferentes, ou na plataforma z/OS (na qual o WebSphere Application Server é executado em várias JVMs), as mensagens do objeto serão serializadas e nenhum benefício no desempenho será obtido para essas mensagens. Os benefícios de mensagem de bytes ainda podem ser obtidos.
  • Há muitas condições do tempo de execução interno que podem fazer com que suas mensagens sejam serializadas, portanto, mesmo se a configuração atender a todas as condições descritas neste tópico, é possível obter algum ou nenhum benefício da ativação das propriedades de "transmissão de carga útil da mensagem por referência".
Tabela 1. Como os fatores de configuração e de tempo de execução determinam quais dados são copiados, quando são copiados e o possível benefício de desempenho.. A primeira coluna lista o grau de potenciais benefícios de desempenho. A segunda coluna inclui os eventos de configuração e do tempo de execução dos potenciais benefícios. A terceira coluna fornece informações, tais como quais dados são copiados e quando os dados são copiados com base nos eventos de configuração e do tempo de execução dos potenciais benefícios.
Grau de benefício de desempenho possível Eventos de configuração e tempo de execução Quando os dados são copiados
Nenhum benefício possível

As propriedades de "transmissão de carga útil da mensagem por referência" não são ativadas (comportamento padrão).

Os dados da mensagem de objeto são copiados logo que são configurados na mensagem e quando são recuperados da mensagem.

Os dados da mensagem de bytes são copiados logo que são configurados na mensagem e quando são recuperados da mensagem.

Algum benefício potencial
As propriedades de "transmissão de carga útil da mensagem por referência" são ativadas e uma ou ambas as condições a seguir são verdadeiras:
  • O envio ou o recebimento da mensagem é realizado.
  • O consumidor não está disponível quando a mensagem é produzida.

[AIX Solaris HP-UX Linux Windows][IBM i]Os dados da mensagem de objeto são copiados somente quando necessário.

Os dados da mensagem de bytes são copiados somente quando necessário.

Máximo benefício possível
As propriedades de "transmissão de carga útil da mensagem por referência" são ativadas e as duas condições a seguir são verdadeiras:
  • Nem o envio nem o recebimento da mensagem é realizado.
  • O consumidor está aguardando pela mensagem quando ela é produzida (por exemplo, se o consumidor for um bean acionado por mensagens).

[AIX Solaris HP-UX Linux Windows][IBM i]Os dados da mensagem de objeto nunca podem ser copiados.

Os dados da mensagem de bytes são copiados somente quando necessário.

Regras que os aplicativos JMS devem obedecer

As partes da especificação que são ignoradas pelas propriedades de "transmissão de carga útil da mensagem por referência" são definidas para garantir a integridade dos dados da mensagem. Se os aplicativos JMS obedecerem as regras fornecidas na tabela a seguir, você poderá ativar de maneira segura as propriedades de "transmissão de carga útil da mensagem por referência" nos connection factories e nas especificações de ativação que os aplicativos usam.

Se você ativar as propriedades de "transmissão de carga útil da mensagem por referência" para os aplicativos JMS que não seguirem essas regras, os aplicativos poderão receber exceções ou, mais importante, a integridade dos dados da mensagem poderá ser comprometida.

Tabela 2. Regras que os aplicativos JMS devem obedecer, por tipo de aplicativo. A primeira coluna lista os tipos de aplicativos JMS. A segunda coluna fornece as regras que o aplicativo JMS deve seguir.
Tipo de aplicativo Regras
Aplicativo do produtor do JMS

Um aplicativo do produtor do JMS que envia as mensagens de objeto não deve alterar o objeto depois que for configurado na carga útil da mensagem.

Um aplicativo do produtor JMS que envia as mensagens de bytes:
  • deve gravar dados na mensagem com uma única chamada em writeBytes(byte[]).
  • não deve alterar a matriz de byte depois que for gravada na mensagem.
Aplicativo do consumidor do JMS

Um aplicativo do consumidor do JMS que recebe as mensagens de objeto não deve alterar a carga útil que obtiver da mensagem.

Aplicativo encaminhador do JMS
Nota: 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.
Um aplicativo encaminhador do JMS que substitui a carga útil da mensagem recebida por uma nova carga útil:
  • (para mensagens de objeto) não deve alterar o objeto depois que for configurado na carga útil da mensagem.
  • (para mensagens de bytes):
    • deve gravar dados na mensagem com uma única chamada em writeBytes(byte[]).
    • não deve alterar a matriz de byte depois que for gravada na mensagem.

Garantindo que as mensagens de objeto possam ser serializadas

Sob condições normais do sistema de mensagens JMS (ou seja, quando as propriedades de "transmissão da carga útil da mensagem por referência" não são ativadas), os dados em uma mensagem de objeto são serializados logo que o objeto for transmitido ao sistema de mensagens, por exemplo, ao configurar ou enviar. Se não for possível serializar a carga útil da mensagem, uma mensagem de exceção será retornada imediatamente para o aplicativo cliente.

Quando as propriedades de "transmissão de carga útil da mensagem por referência" são ativadas, a carga útil da mensagem é aceita para o aplicativo cliente sem a tentativa de serializá-la. Se o sistema posteriormente constatar que os dados não podem ser serializados, o sistema não poderá mais informar o aplicativo cliente que enviou a mensagem - e como os dados não são serializáveis, o sistema não poderá persistir nem transmitir a mensagem completa. A mensagem e suas propriedades são armazenadas, mas os dados do usuário contidos na mensagem (a carga útil) não podem ser armazenados e são descartados. Se houver problemas de serialização quando o sistema tentar converter uma mensagem de objeto em um gráfico de dados para uma mediação, a carga útil da mensagem será descartada, e a mediação receberá uma mensagem com o valor de dados definido como nulo.

Se os seus dados não puderem ser serializados, eles serão perdidos. Portanto, primeiro você deve testar a configuração sem ativar as propriedades de "transmissão da carga útil da mensagem por referência" para verificar se todos os dados enviados para o sistema são serializáveis.

Quando o sistema constatar que uma mensagem de objeto não pode ser serializada, ele gravará a seguinte mensagem de erro (JMS_IBM_ExceptionMessage) no arquivo SystemOut.log, em que "{0}" é substituído pelo nome da classe do objeto com falha:
Nota: Esse tópico faz referência a um ou mais arquivos de log do servidor de aplicativos. Como uma recomendação alternativa, é possível configurar o servidor para usar a infraestrutura de log e rastreio do High Performance Extensible Logging (HPEL) em vez de usar os arquivos SystemOut.log , SystemErr.log, trace.log e activity.log em sistemas distribuídos e IBM® i. Também é possível usar HPEL em conjunção com os recursos de criação de log z/OS nativos. Se você estiver usando HPEL, será possível acessar todas as informações de log e rastreio usando a ferramenta de linha de comandos LogViewer a partir do diretório bin do perfil do servidor. Consulte as informações sobre a utilização do HPEL para resolução de problemas dos aplicativos para obter mais informações sobre o uso do HPEL.
CWSIK0200E: Um objeto de classe "{0}" foi configurado na carga útil da mensagem, mas não pode ser serializado.
Explicação: Uma mensagem de objeto enviada com o sinalizador producerDoesNotModifyPayloadAfterSet ativado no connection factory foi enviado com uma carga útil que não era serializável pelo sistema. Os dados desta mensagem foram perdidos.
Ação: Desative o producerDoesNotModifyPayloadAfterSet no connection factory. Sem o sinalizador ativado, o aplicativo JMS que configura o objeto na mensagem receberá qualquer exceção de serialização imediatamente.
As propriedades de exceção a seguir são usadas para indicar que um objeto de dados não pode ser serializado e foi descartado. Os aplicativos JMS podem descobrir o que aconteceu com base nas propriedades JMS_IBM_Exception. As mediações podem descobrir o que aconteceu com base nas propriedades JMS_IBM_Exception e SI_Exception.
JMS_IBM_ExceptionReason
SIRCConstants.SIRC0200_OBJECT_FAILED_TO_SERIALIZE
JMS_IBM_ExceptionTimestamp
O momento em que o objeto falhou na serialização, no formato System.currentTimeMillis().
JMS_IBM_ExceptionMessage
Mensagem CWSIK0200E, conforme descrito anteriormente.
SI_ExceptionReason
SIRC0200_OBJECT_FAILED_TO_SERIALIZE
SI_ExceptionTimestamp
O momento em que o objeto falhou na serialização, no formato System.currentTimeMillis().
SI_ExceptionInserts
Uma matriz de cadeia que contém uma entrada. A entrada contém o nome da classe do objeto.
Nota: Os motivos pelos quais os objetos de dados não podem ser serializados é que você gravou seus próprios métodos writeObject() ou writeExternal() e não testou completamente cada opção (por exemplo, as exceções NullPointer ou as exceções ArrayIndexOutOfBounds).

Ícone que indica o tipo de tópico Tópico de Conceito



Ícone de registro de data e hora Última atualização: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=cjn_passbyref
Nome do arquivo: cjn_passbyref.html