Lotus Notes / Domino Sonstiges > Java und .NET mit Notes/Domino
object has been removed or recycled
exratt:
hi :)
ich hab da ein problem mit der domino java-api. ich erstelle im hauptprogramm ein fenster mit einem jtree, mit dessen hilfe ich die databases, darunter die views und darunter wiederum die documents anzeigen will. dem tree übergebe ich dabei das session-objekt. er wird aber nicht gleich komplett aufgebaut, sondern es wird immer erst die nächste ebene geladen, wenn man einen teil aufklappt. dadurch wird ein event ausgelöst und eine funktion explore() im jeweiligen treenode aufgerufen. dort bekomme ich folgenden fehler:
--- Code: ---NotesException: Object has been removed or recycled
at lotus.domino.local.NotesBase.CheckObject(Unknown Source)
at lotus.domino.local.Database.getViews(Unknown Source)
at test.DatabaseNode.explore(DatabaseNode.java:76)
at test.DominoTree.treeExpanded(DominoTree.java:47)
at javax.swing.JTree.fireTreeExpanded(Unknown Source)
at javax.swing.JTree.setExpandedState(Unknown Source)
at javax.swing.JTree.expandPath(Unknown Source)
at javax.swing.plaf.basic.BasicTreeUI.toggleExpandState(Unknown Source)
at javax.swing.plaf.basic.BasicTreeUI.handleExpandControlClick(Unknown Source)
...
--- Ende Code ---
das problem scheint mir, dass der notes-thread nicht mehr gültig ist und das database-objekt somit keine gültigkeit mehr hat. wie komme ich nun an dieses objekt heran, ohne wieder von vorn alles aufzurollen (session erzeugen und über diese die datenbank holen)? das problem ist ja auch, dass ich in dem fall gar nicht weiß, welche datenbank ich da geöffnet habe...
der vollständigkeit halber nochmal die explore-funktion innerhalb meiner DatabaseNode-Klasse:
--- Code: --- public void explore()
{
if ( !isExplored() )
{
Database database = getDatabase();
try
{
// folgende zeile erzeugt den fehler
Iterator<View> views = database.getViews().iterator();
while ( views.hasNext() )
add( new ViewNode( views.next() ) );
explored = true;
}
catch ( NotesException exc )
{
exc.printStackTrace();
}
}
}
--- Ende Code ---
ist das problem relativ einfach zu lösen? oder wäre es vielleicht doch besser, wenn ich mir ein gutes buch zu dem thema hole und ein wenig schmökere... mit domingo hab ich auch schon ein wenig rumgespielt, aber leider bietet es nicht alle funktionen wie die original-api, auf die ich nicht unbedingt verzichten will (z.b. alle datenbanken eines directories geben lassen).
ich hoffe, mein problem wurde verständlich. ich danke schonmal im vorraus für die hoffentlich erscheinende hilfe :) bis demnächst
flaite:
Du solltest auf jeden Fall mit der Methode
NotesDatabase.isOpen()
abfragen können, ob das Objekt database brauchbar ist.
Wie sieht die Methode getDatabase() aus?
In der Methode könntest du Exceptions/Errors auf nicht mehr brauchbare Database-Objekte abfangen und dir entsprechend ein neues Database Objekt holen.
So ganz Blick ich da aber nicht durch.
Gruß Axel
exratt:
ok, kurz zur erklärung. ich habe einen jtree, in dem ich als wurzel ein directory hab, darunter die darin enthaltenen datenbanken, darunter die views und darunter wiederum die dazugehörigen dokumente. ich habe jetzt eigene treenode-klassen für jede dieser domino-objekte geschrieben. ein treenode hat normalerweise eine methode getUserObject(), die das objekt zurückliefert, welches der knoten anzeigen soll. ich speichere in dem oben angegebenen fall mein database-objekt im userobjekt und rufe in der methode getDatabase() lediglich getUserObject() auf und caste entsprechend auf Database.
das ganze ist aber nur ein beispiel und tritt bei mir auch nicht das erste mal auf, in den anderen fällen hab ich das dann aber einfach anders geregelt (aka alles in der selben klasse gemacht), so dass ich keine probleme bekommen hab. anfangs wollte ich ein eigenes treemodel schreiben und wie gesagt, das gleiche problem trat dort auch auf.
prinzipiell könnte ich in dem fall zwar sicher prüfen, ob die datenbank gültig ist, aber kann ich denn auch, wenn sie es nicht ist, noch einige daten abfragen? denn wenn ich nicht weiß, welche datenbank das ist, kann ich auch kein neues objekt davon erstellen... nunja, ich werd mal ein wenig rumprobieren.
edit: schon am isOpen() scheitert das programm mit selbiger fehlermeldung... sieht also so aus, als wenn ich gar nicht da ran komme und somit kann ich es auch nicht neu erstellen. es muss ne möglichkeit geben, an das objekt ranzukommen, denn defacto existiert es ja noch (nur halt evtl innem anderen notesthread oder so). wenn nicht, tjo, dann ist das reichlich daneben...
edit2: ich muss wohl den startthread irgendwie am leben erhalten, wenn childthreads unterwegs sind. bei eventhandling ist das offenbar der fall. bis eben hab ich nicht darüber nachgedacht, dass meine main-methode nach erstellung und anzeige meines frames weiterläuft und nicht blockiert :D so dass dann auch gleich wieder der notesthread terminiert wird, was ja nicht ganz im sinne des programms ist. ich wer also mal weiter rumprobieren ;)
edit3: hab sinitthread jetzt im frame constructor gemacht und stermthread in windowClosed. allerdings wird das ja über eventhandling aufgerufen und somit fürchte ich, dass das quark ist, da das wieder ein eigener thread sein sollte :[
dennoch tritt der fehler nicht mehr auf. musste allerdings in den methoden, in denen ich mit dem datenbankobjekt arbeite, wieder ein init- und termthread machen, da es sonst andere fehler gibt. irgendwie find ich die api unnötig kompliziert... zu schade, dass domingo nicht ganz die funktionalität hat, sonst wäre das ganze evtl einiges einfacher...
auf jeden fall scheint es jetzt zu klappen, ich kann am tree rumspielen ohne fehler und mit erwartetem ergebnis, ist ne tolle sache :)
ich werd mich sicher nochmal melden, wenn ich weitere probleme mit der api habe oder so ;) und nichts desto trotz darfst du hier auch noch was schreiben, wenn du was anmerken willst, auch wenn es zu funzen scheint. danke dir ^^
flaite:
danke für den spannenden Bericht ;D
zu edit3: Ich persönlich schrecke sehr davor zurück, sessions unnötig lange zwischen sinit und sterm zu halten. Aber für manche Aufgaben geht es halt nicht anders.
Theoretisch könntest du dir auch bei jeder Node die entsprechenden Childs für deinen Tree mit einer frischen session holen. Das kostet zwar Performance (und zwar viel), würd aber diese Architektur ziemlich lange diskursiv verteidigen. Normalerweise soll man sessions mit Datasources immer kurz offenhalten. Aber es gibt sicher auch Ausnahemn.
Warum du einen zweiten sinit-sterm Zyklus auf dem ersten braucht, weiss ich allerdings auch nicht.
Sofern du das auf anderen Rechnern deployen willst...
Ich schätze, dass 85% der User nicht ihr aktuelles Domino Programm Verzeichnis als erstes in ihrem OS-Path stehen haben. Oft ist Domino gar nicht im Path oder eine obskure Zusatzinstallation, die da irgendwann mal aus dunklen Gründen installiert wurde.
Schreib an mögliche Anwender auf jeden Fall gut sichtbar eine Info dazu und überleg dir ein dem Anwender angemessenes Vorgehen für den schnellen Support.
Gruß Axel
exratt:
so, jetzt hab ich neue fragen :) könnt zwar auch einen neuen thread aufmachen, aber da es sich um das selbe "projekt" handelt, hau ich das mal hier rein.
zum einen eine kleine rechte-sache: ich bin manager auf einer datenbank (habe das so abgefragt). aber wenn diese datenbank in einem extra thread verwendet wird (event-handling, mit NotesThread.sinitThread() neuer thread eingeleitet), dann habe ich plötzlich keinen zugriff mehr. ich bekomme die datenbank zwar grundsätzlich noch angezeigt mitsamt inhalten, aber wenn ich mein recht über das acl abfrage, habe ich grundsätzlich NOACCESS. das ist doof...
nächstes problem: in der hilfe steht, dass man für remote-calls nicht extra sinitThread etc. aufrufen muss, sondern dass es ohne thread geht, da die eigentlichen operationen auf dem server ausgeführt werden. nun habe ich aber das problem, dass ich einen "NotesException: Object no longer exists on server" Fehler bekomme, wenn im Event-Handling-Thread auf das objekt zugegriffen werden soll. irgendwie auch doof ;)
edit: ich spiele mit dem gedanken, mir mal ein buch zu dem thema zu kaufen, in dem es vielleicht etwas ausführlicher oder klarer erklärt wird, als in der hilfe oder doku. kannst du mir evtl empfehlungen geben oder von büchern abraten? ihr habt zwar einige literaturvorschläge im forum, aber da ich nicht 5 bücher kaufen will, wäre eine einschränkung gut... dann gibt es wohl noch nicht allzu lang das buch Java unter Lotus Domino von Thomas Erkert, zu dem du auch das Inhaltsverzeichnis sehen kannst. vielleicht kennst du das buch ja und kannst sagen, ob es sich lohnt oder so?
Navigation
[0] Themen-Index
[#] Nächste Seite
Zur normalen Ansicht wechseln