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.
- 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.
- 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
- 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.
- 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".
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:
|
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:
|
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.
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:
|
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:
|
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.
- 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.
- 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.