Mithilfe einiger Optimierungsverfahren können Sie die Leistung von Nachrichtenflüssen verbessern, in denen Java™ verwendet wird.
Über den JavaCompute können Sie die gesamte zulässige Java-Verarbeitung einschließen; bereits vorhandene Java-Klassen für bestimmte Funktionen werden normalerweise wiederverwendet. Allerdings beeinträchtigt dieser Code die Leistung des Nachrichtenflusses, daher müssen Sie sicherstellen, dass der auf diese Weise verwendete Code auch effizient eingesetzt wird.
Für die Nachrichtenverarbeitung sollten Sie nach Möglichkeit die von IBM® WebSphere Message Broker bereitgestellten Knoten und Funktionen verwenden, anstatt bereits vorhandene Funktionen erneut zu erstellen. So sollten Sie beispielsweise im JavaCompute keinen benutzerdefinierten XML-Parser verwenden. Der in WebSphere Message Broker bereitgestellte XMLNSC-Parser ist ein leistungsfähiger Parser, mit dem auch Schemas überprüft werden können. Außerdem kann die von diesem Parser generierte Nachrichtenbaumstruktur im gesamten Nachrichtenfluss verwendet werden, was bei einem benutzerdefinierten Parser mit eigenen Datenstrukturen nicht der Fall ist.
Nach Möglichkeit sollten im JavaCompute keine neuen Prozesse für eine bestimmte Arbeitseinheit gestartet werden. Dies wirkt sich nachteilig auf die Leistung aus und verursacht einen höheren CPU-Aufwand, da bei der Ausführung viele kurzlebige Prozesse gestartet und beendet werden. Die WebSphere Message Broker-Laufzeit bietet unter anderem den Vorteil, dass Prozesse langlebig sind und die Prozessinitialisierung dadurch minimiert wird. Der Verarbeitungsaufwand wird dadurch insgesamt reduziert, weil nicht bei jedem Aufruf des Nachrichtenflusses neue Prozesse gestartet werden.
Informationen zu Tools, mit denen der aktuelle Status einer aktiven Java-Anwendung ermittelt werden kann, finden Sie unter developerWorks IBM Monitoring and Diagnostic Tools for Java - Health Center Version 2.1.
Vermeiden Sie das Erstellen von Strukturen und das Navigieren in Strukturen ohne zwischengespeicherte Verweise. Der folgende Code beispielsweise muss zur Erstellung der Struktur immer wieder von root aus navigieren:
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);
Es ist effizienter, wie im folgenden Beispiel Verweise zu speichern:
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);
Der Operator + beeinträchtigt die Leistung, da durch ihn für jede neue Verkettung ein neues Zeichenfolgeobjekt erstellt wird; Beispiel:
keyforCache = hostSystem + CommonFunctions.separator
+ sourceQueueValue + CommonFunctions.separator
+ smiKey + CommonFunctions.separator
+ newElement;
Das folgende Beispiel zeigt, wie Sie die Leistung verbessern können, indem Sie java.lang.String-Objekte mithilfe der Klasse 'StringBuffer' und der Methode 'append' anstatt mit dem Operator + verketten:
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();
Wenn ein großes Binärobjekt verarbeitet werden soll (beispielsweise durch Aufteilen in Blöcke oder durch Einfügen von Zeichen), empfiehlt sich die Verwendung eines JavaComputes, da dieser über leistungsfähige Verarbeitungsfunktionen verfügt. Bei Verwendung eines JavaComputes sollten große Binärobjekte mit 'ByteArrays' und 'ByteArrayOutputStream' verarbeitet werden.
Rufen Sie die Garbage-Collection nach Möglichkeit nicht manuell auf, da dadurch die Verarbeitung in der JVM ausgesetzt wird, was den Nachrichtendurchsatz erheblich einschränkt. Bei einem Java-basierten Transformationsnachrichtenfluss beispielsweise, der ohne aktive Garbage-Collection 1300 Nachrichten in der Sekunde verarbeitete, sank die Verarbeitung auf 100 Nachrichten pro Sekunde, wenn für jede Nachricht, die verarbeitet wurde, zusätzlich noch manuell die Garbage-Collection aufgerufen wurde.