Lotus Notes / Domino Sonstiges > Java und .NET mit Notes/Domino

Error cleaning up agent threads und WeakReference...

(1/19) > >>

Mark³:
Ich nutze Java-Agenten in Notes, um auf HP Openview Service Desk mit der web-api zuzugreifen. Für diejenigen, die Openview nicht kennen: Mittels der web-api erzeuge ich ein Objekt vom Typ ApiSDSession, mit welchem ich alle Aktionen im Openview Service Desk ausführen kann. Der Server dazu steht irgendwo im WAN.

Der Fehler 'error cleaning up agent threads' entsteht dadurch, dass ein Notesagent andere Threads startet und beim Beenden nicht weiß, ob die anderen Threads alle ebenfalls beendet wurden. Das Objekt ApiSDSession hat die Methode closeConnection(), womit die Verbindung zum Openview-Server beendet wird. Nun kann man das Objekt auf null setzen und alles ist im Lot. Nur merkt Notes das leider nicht.
Bei Notes.net gibt es eine Technote, um den Fehler einzugrenzen. Dafür sammelt man alle Threads aus der Threadgroup, in der der aktuelle Agent läuft. Normal findet man zwei Threads, die beide zum Notesagenten gehören. Bei mir finde ich 4 Threads, zwei haben den Namen 'WeakReference Plumber' die wohl zu dem Openview-Objekt gehören.
Zu WeakReference habe ich in einer Javadokumentation gefunden, dass solche Objekte ruhig garbage collected werden können auch wenn  man nicht sicher ist ob sie ordentlich finalisiert wurden (ich bin hier nicht so der Experte auf diesem Gebiet). Scheinbar hilft Notes das nicht.
Wenn ich diesen Agenten nun mehrmals hintereinander aufrufe bekomme ich einen Speicherüberlauf in der JVM (die DB liegt auf dem Server, den Agenten starte ich über einen Button in einem Dokument). Dies scheint aber nur bei unseren 6.03-Installationen aufzutreten. Beim 6.54 bekomme ich zwar auch den '...cleaning up...'-Fehler in der Konsole, aber keinen Speicherüberlauf.  :'(

Habt ihr noch Ideen, wie ich das umschiffen könnte? Die web-api.jar (und auch die anderen Java-Klassen) nutze ich übrigens, indem ich alle Klassen in Eclipse entwickle und als Notes Agent mit Imported Java ausführe (keine Einträge in der Notes.ini oder so)

Jede Anregung willkommen... O0

flaite:
keine konkrete Lösung.
Der Begriff WeakReferences wird meistens für konstrukte wie folgt gewählt ->
Ein Objekt ist eligible for garbage collection, wenn keine Referenzen aus anderen Objekten auf dieses Objekt mehr existieren.
Manchmal ist es wünschenswert, dass Objekte auch dann eligible for garbage Collection sind, wenn sie noch in bestimmten Container-Objekten wie Maps referenziert werden (z.B. ist WeakHashMap eine konkrete Implementierung davon). Das Objekt muß dann selbst in eine WeakReference gewrappert werden. 
Verdammt viele googles gegen solche weiterführende Java-Geschichten landen übrigens immer in der gleichen Quelle:
http://javaalmanac.com/egs/java.util/coll_WeakMap.html

Idee: Vielleicht kannst du selbst die Objekte auf Null setzen, die von WeakReferencePlumber referenziert werden? Oder dir zumindest per Debugger oder ähnlichem einen Überblick zu verschaffen.

Deine Idee mit Imported Java könnte eventuell zu den OutOfMemoryException führen.
Kannst du die in Eclipse entwickelten Klassen nicht einfach in ein jar packen und dann in lib/ext der VM? Wenn das zu Deployment Problemen führt, weil das lokale Agenten sind, kann man das evtl. über Mails verteilen. Wir hatten solche OutOfMemories wenn ich mich recht erinnere auch z.B. wenn JDBC Treiber an den Agent gehängt wurden statt sie in UserClasses oder in java/lib/ext zu tun.

Gruß Axel

Ralf_M_Petter:
Hallo Mark!

Zusätzlich zu dem was Axel schon so gut erklärt hat. Sehr häufig werden Weakreferences für Cache Kostrukte hergenommen und sollten eigentlich verhindern, dass der Cache den Speicher sprengt. Aber etwas anderes, ich mache eigentlich kaum noch diese Java Agent Sachen, da es mir einfach zu wenig stabil ist (Lotus sollte da wirklich mal was tun). Ausserdem ist halt JDK 1.3.1 mittlerweile schon ein wenig fad. Ich habe beste Erfahrung gemacht, dass ausserhalb des Domino Servers in einer eigenen JVM zu betreiben. Das läuft mit wesentlich besserer Performance da bessere JVM und man hat wesentlich weniger Probleme mit den ganzen Besonderheiten von Notes. Also einfach mal den Agent in ein externes Programm auslagern und das ganze kann ja dann auch über ein Programmdokument bequem zeitgesteuert vom Server aufgerufen werden.

Grüße

Ralf

flaite:
Mark,

beide von dir geschilderten Probleme sind im Prinzip Plattform-Probleme. Genauer Plattform-Probleme der Java Runtime in Notes.
Das Problem ist, dass die Designer der Plattform Java in Notes diese Probleme nicht vorhergesehen haben. Genau das ist die Wurzel aller "Java isn't very well implemented in Lotus Notes"-Diskussionen.

Plattform-Probleme treten überall auf.
Z.B. sollte man mal versuchen einen Ankerlink innerhalb von Jsr-168 Portlets zu programmieren. Es ist deutlich schwerer als man denkt und am Ende habe ich es ohne Ankerlink programmiert.

Der Grund?

--- Zitat ---All the decisions, all the architecture, all the languages, the tools, the databases, the protocols, the hardware, they are all the way they are because we zigged instead zagged.

--- Ende Zitat ---
http://damienkatz.net/2006/03/my_new_favorite_1.html

Bei Plattformproblemen entstehen sehr oft unabsehbare Kosten. In Notes-Java gibt es  eine Menge dieser Issues. Vermutlich dauert deshalb die Eclipsierung von Notes so lange. In Java Plattformen (J2EE-basiert, Kombinationen von OS-Frameworks, Eclipse, etc) gibt es diese spezifische Häufung von Problemen nicht. Probleme - d.h. Aufgabenstellungen, die sich als deutlich komplexer herausstellen als man erst denkt, gibts natürlich überall.

Was ich eigentlich sagen will: Um das WARUM dieser 2 gemeldeten issues zu ermitteln, muß man vermutlich wirklich tief buddeln.  ;D

Gruß Axel

Axel

Mark³:
Vielen Dank für die Hinweise, scheinbar ist Notes so nicht in der Lage mit imported java umzugehen.
Einige Anwender bekommen auch die Fehlermeldung:

--- Code: ---JVM: Attempt to retrieve Java agent attachments failed
--- Ende Code ---

Die jar für Openview ist 3.7MB groß, das ist bestimmt nicht gut, die im Agenten zu importieren.
Ich denke, ich muss die Openview-Logik auf dem Server zentralisieren und die Aktionen der Anwender dann asynchron verarbeiten. Wo sollte die große jar-Datei dann liegen, auf dem Server mit JavaUserClasses in der Notes.ini (bzw. Configuration-Dokument) oder geht es auch als Skriptlibrary in der Datenbank?
@Ralf: Wenn ich eine eigene VM für das Programm nehmen würde, wie würde ich das dann einbinden? Per Programmdokument kann ich das ja nicht ereignisgesteuert laufen lassen, oder? TriggerHappy von Damien Katz könnte ich als Trigger nehmen aber das erscheint mir irgendwie zu krumm...

Vielleicht habt ihr noch ein paar Ideen, wenn ich die Anforderung konkretisiere: Ich verwalte in der Notesdatenbank Empfangsbestätigungen für Hardware, die dann digital signiert werden. Der jeweilige Zustand der Bestätigung muss dann mit Openview synchronisiert werden.

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln