Você pode melhorar o desempenho do fluxo de mensagens com Java™ utilizando algumas técnicas de otimização.
O nó JavaCompute permite incluir qualquer válido processamento Java , e é comum para reutilizar existente classes Java para funções específicas. Entretanto, esse código impacta o desempenho do fluxo de mensagens, portanto, certifique-se de que qualquer código utilizado desta maneira é eficiente.
Onde for possível, utilize os nós e funções fornecidas do IBM® WebSphere Message Broker para executar o processamento em uma mensagem, em vez de recriá-los função que já é fornecida. Por exemplo, não use um analisador XML customizado no nó JavaCompute. O analisador XMLNSC que é fornecido com o WebSphere Message Broker é um analisador que também oferece validação em relação a um esquema, e a árvore de mensagens que ele gera podem ser utilizados em todo o fluxo de mensagens. O que não é o caso com um analisador customizado com suas próprias estruturas de dados.
Evite iniciar novos processos no nó JavaCompute para executar uma parte específica do trabalho. Isso é dispendioso em termos de desempenho e resulta em custos adicionais de CPU e um aumento de carga no sistema, porque muitos processos de curta duração são iniciadas e finalizadas quando o trabalho está concluído. Um dos benefícios do WebSphere Message Broker de tempo de execução é que os processos são muito longa e a inicialização é minimizado. Isso reduz o total dos custos de processamento, porque novos processos não são iniciados cada vez que o fluxo de mensagens é chamado.
Para obter informações sobre ferramentas que você pode utilizar para avaliar o status atual de um em execução Java aplicativo, consulte developerWorks IBM Monitoring and Diagnostic Tools para Java – Health Center Version 2.1.
Evite árvores de navegação e de construção sem armazenar referências do intermediário. Por exemplo, o código a seguir navega várias vezes a partir de root para construir a árvore:
MbMessage newEnv = new MbMessage(inAssembly.getMessage());
newEnv.getRootElement().createElementAsFirstChild(MbElement.TYPE_NAME, "Destination", null);
newEnv.getRootElement().getFirstChild().createElementAsFirstChild(MbElement.TYPE_NAME, "MQDestinationList", null);
newEnv.getRootElement().getFirstChild().getFirstChild().createElementAsFirstChild(MbElement.TYPE_NAME,"DestinationData", null);
No entanto, é mais eficiente de armazenar referências conforme mostrado no exemplo a seguir :
MbMessage newEnv = new MbMessage(inAssembly.getMessage());
MbElement destination = newEnv.getRootElement().createElementAsFirstChild(MbElement.TYPE_NAME,"Destination", null);
MbElement mqDestinationList = destination.createElementAsFirstChild(MbElement.TYPE_NAME, "MQDestinationList",
null);
mqDestinationList.createElementAsFirstChild(MbElement.TYPE_NAME,"DestinationData", null);
O operador + tem um impacto negativo no desempenho, pois envolve a criação de um novo objeto de Cadeia para cada concatenação; por exemplo:
keyforCache = hostSystem + CommonFunctions.separator
+ sourceQueueValue + CommonFunctions.separator
+ smiKey + CommonFunctions.separator
+ newElement;
Para melhorar o desempenho, utilize a classe StringBuffer e o método append para concatenar objetos java.lang.String, em vez do operador + , conforme mostrado no exemplo a seguir:
StringBuffer keyforCacheBuf = new StringBuffer();
keyforCacheBuf.append(hostSystem);
keyforCacheBuf.append(CommonFunctions.separator);
keyforCacheBuf.append(sourceQueueValue);
keyforCacheBuf.append(CommonFunctions.separator);
keyforCacheBuf.append(smiKey);
keyforCacheBuf.append(CommonFunctions.separator);
keyforCacheBuf.append(newElement);
keyforCache = keyforCacheBuf.toString();
Se desejar processar um BLOB (cortando em partes ou inserindo caracteres, por exemplo), é eficiente usar um nó JavaCompute com seus recursos de processamento fortes. Se você estiver utilizando um nó JavaCompute, utilize ByteArrays e ByteArrayOutputStream para processar o BLOB.
Evite chamar a coleta de lixo manualmente, pois ela suspende o processamento na JVM, que inibe significativamente o rendimento do processamento de mensagens. Em um exemplo, um fluxo de mensagens de transformação baseada em que estava processando a uma taxa de 1300 mensagens por segundo sem coleta de lixo manual foi reduzido para 100 mensagens por segundo quando um manual de coleta de lixo foi incluído na chamada para cada mensagem que está sendo processada.