Transmitir carga útil da mensagem por referência: Benefícios em potencial para cada etapa de processo
Para cada etapa de processamento assumida pelo seu aplicativo de sistema de mensagens JMS, verifique esta tabela para ver quando e porque há um potencial benefício de desempenho na ativação das propriedades "passar carga útil da mensagem por referência" na connection factory ou especificação de ativação associada.
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.
- 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.
Etapa de Processamento | Há potencial para melhoria do desempenho? | Explicação |
---|---|---|
Mensagens de objetos com aplicativos produtores e consumidores | ||
Uma mensagem de objeto é enviada para um aplicativo consumidor na mesma JVM. As propriedades producerDoesNotModifyPayloadAfterSet e consumerDoesNotModifyPayloadAfterGet são ambas ativadas. | Yes | Sob determinadas condições, o objeto de carga útil é passado por referência para o aplicativo
consumidor. Se a mensagem não for persistente ou transacionada, e o aplicativo consumidor estiver imediatamente disponível, o objeto de carga útil talvez nunca seja serializado. |
Uma mensagem de objeto é produzida com a propriedade producerDoesNotModifyPayloadAfterSet ativada e, em seguida, recebida por um aplicativo consumidor para o qual a propriedade consumerDoesNotModifyPayloadAfterGet não está ativada. | Não | Nenhum benefício é obtido porque o aplicativo consumidor não possui a propriedade consumerDoesNotModifyPayloadAfterGet ativada. |
Uma mensagem de objeto é enviada para um único aplicativo consumidor em uma JVM diferente. As propriedades producerDoesNotModifyPayloadAfterSet e consumerDoesNotModifyPayloadAfterGet são ambas ativadas. | Não | Nenhum benefício é obtido porque o único aplicativo consumidor está em uma outra JVM. |
Uma mensagem de objeto é recebida por vários aplicativos consumidores (um tópico) que possuem a propriedade consumerDoesNotModifyPayloadAfterGet ativada e estão todos em execução na mesma JVM. | Yes | Todos os aplicativos consumidores com a propriedade consumerDoesNotModifyPayloadAfterGet ativada podem receber uma referência para o mesmo objeto, embora isso não seja garantido. |
Mensagens de objetos com aplicativos encaminhadores | ||
Uma mensagem de objeto é encaminhada e o aplicativo encaminhador acessa a carga útil da mensagem. As propriedades consumerDoesNotModifyPayloadAfterGet e producer/forwarderDoesNotModifyPayloadAfterSet são ativadas. | Yes | Há um potencial benefício de desempenho nos seguintes casos:
|
Uma mensagem de objeto é encaminhada e o aplicativo encaminhador acessa a carga útil da mensagem. Apenas a propriedade producer/forwarderDoesNotModifyPayloadAfterSet está ativada. | Yes | Há um potencial benefício de desempenho se o consumidor da mensagem encaminhada tiver a propriedade consumerDoesNotModifyPayloadAfterGet ativada e estiver na mesma JVM que o aplicativo encaminhador. |
Uma mensagem de objeto é encaminhada e o aplicativo encaminhador não acessa a cada útil da mensagem. | Não | Se a carga útil da mensagem de objeto não for acessada pelo aplicativo encaminhador, então as propriedades producer/forwarderDoesNotModifyPayloadAfterSet e consumerDoesNotModifyPayloadAfterGet não têm nenhum efeito para o aplicativo encaminhador. Os benefícios obtidos a partir do aplicativo produtor original e o aplicativo consumidor final são mantidos. |
Mensagens de objeto com mediações | ||
Uma mensagem de objeto é enviada para um destino do barramento de integração de serviços mediado. | Não | Se a mensagem de objeto for enviada para um destino mediado, então nenhum benefício de desempenho será obtido ao ativar a propriedade producerDoesNotModifyPayloadAfterSet. |
Mensagens de bytes com aplicativos consumidores | ||
Uma mensagem de bytes é enviada para qualquer aplicativo consumidor. A propriedade producerDoesNotModifyPayloadAfterSet está ativada. | Yes | A parte da especificação JMS que ordena a cópia dos dados na configuração para a mensagem é ignorada, salvando uma cópia dos dados de bytes. |
Uma mensagem de bytes é recebida com a propriedade consumerDoesNotModifyPayloadAfterGet ativada. | Não | A API JMS não permite que dados de bytes sejam passados por referência de volta ao código do consumidor (métodos BytesMessage.readBytes). |
Uma mensagem de bytes é recebida por vários consumidores (um tópico) que possuem a propriedade consumerDoesNotModifyPayloadAfterGet ativada. | Não | A API JMS não permite que dados de bytes sejam passados por referência de volta ao código do consumidor (métodos BytesMessage.readBytes). |
Mensagens de bytes com aplicativos encaminhadores | ||
Uma mensagem de bytes é encaminhada. | Não | Não há nenhum benefício obtido a partir da ativação de qualquer uma das propriedades de "transmissão de carga útil da mensagem por referência". |