Das Notes Forum
Domino 9 und frühere Versionen => ND6: Administration & Userprobleme => Thema gestartet von: Mandalor am 09.08.05 - 17:35:43
-
Hallo, ich bin am verzweifeln:
Folgendes Priblem ich baue gerade das Planerapplet in eine DB ein. Den Exchanger habe ich angepasst. Alles Funktioniert Super, wenn ich die Maske aus dem Designer starte, Starte ich sie aber über eine Schaltfläche, dann kommt (mit etwas Glück NSD). Das heißt, es kommt nicht immer, aber so mit einer Wahrscheinlichkeit von 30-40 %
Hat jemand eine Idee???
-
Hi, dann stell doch mal das nsd-file zur Verfügung. Da steht u.U. ein Hinweis auf die Ursache drin.
Gruß
-
Sorry, geht nicht ist zuuuu groß (714.000 Zeichen), ich habe den Fehler lokalisiert: es passiert beim lesen von aus Notes: (doc.getColumnValues().elementAt(2)), aber nur manchmal!!!! , wenn es abschmiert, dann immer hier!
-
Tippe mal auf ein Threadingproblem, kannst du mal den Code posten wo der Fehler auftritt. Gut wäre natürlich wenn man erkennen könnte in welchem Thread das ganze läuft.
Grüße
Ralf
-
Das ding liest die Werte über die Ansicht aus den Docs und genau da schmiert er aber, wenn er keine Lust mehr hat!
view = dbNotes.getView("VData") ;
doc = view.getFirstDocument() ;
while( doc != null )
{ System.out.println("DOC ist da") ;
DateTime start = (DateTime)doc.getColumnValues().elementAt(0) ;
System.out.println("DOC ist da2") ;
DateTime end = (DateTime)doc.getColumnValues().elementAt(1) ;
Date notesDateStart = start.toJavaDate() ;
Date notesDateEnd = end.toJavaDate() ;
System.out.println("DOC ist da3") ;
String row = (String)doc.getColumnValues().elementAt(2) ;
String name = (String)doc.getColumnValues().elementAt(3) ;
//String creator ="leer";//(String)doc.getColumnValues().elementAt(8) ;
String cat = (String)doc.getColumnValues().elementAt(4) ;
System.out.println("DOC ist da4") ;
String target = (String)doc.getColumnValues().elementAt(5) ;
String purpose = "Test";//(String)doc.getColumnValues().elementAt(6) ;
System.out.println("DOC ist da5") ;
-
Sorry aber der Codeteil nützt nicht besonders viel, da man nicht sieht in welcher Methode des Applets das aufgerufen wird. Poste doch etwas mehr, damit man einen Überblick bekommt.
Noch ne ander Frage verwendest du in deiner Schleife recycle(); Stürzt er beim ersten Durchlauf ab oder macht er die Schleife einige male?
Grüße
Ralf
-
die Schleife läuft ca. 1000 - 1600 mal durch, er stützt bei einem zufälligen Doc ab (manchmal läuft er auc durch)
Ja recycle() wird verwendet
mehr Code:
private void initSlotData( PlanerOptions opt )
{
try
{
PlanerDatabase planerDb = opt.getDb() ;
Calendar calendar = Calendar.getInstance() ;
//calendar.setTimeZone(TimeZone.getTimeZone("GMT"));
Database dbNotes = null ;
View view = null;
Document doc = null, doc1 = null ;
System.out.println("OK 201") ;
dbNotes = session.getDatabase(applet.getParameter("Server"),
applet.getParameter("Database")) ;
this.initSlotKinds(dbNotes, planerDb);
view = dbNotes.getView("VResources") ;
doc = view.getFirstDocument() ;
while( doc != null )
{
String row = (String) doc.getColumnValues().elementAt(0) ;
if(planerDb.getRowNb(row)<0){
planerDb.addRow(row);
}
doc1 = doc ;
doc = view.getNextDocument(doc) ;
doc1.recycle();
}
view = dbNotes.getView("VData") ;
doc = view.getFirstDocument() ;
while( doc != null )
{ System.out.println("DOC ist da") ;
DateTime start = (DateTime)doc.getColumnValues().elementAt(0) ;
System.out.println("DOC ist da2") ;
DateTime end = (DateTime)doc.getColumnValues().elementAt(1) ;
Date notesDateStart = start.toJavaDate() ;
Date notesDateEnd = end.toJavaDate() ;
System.out.println("DOC ist da3") ;
String row = (String)doc.getColumnValues().elementAt(2) ;
String name = (String)doc.getColumnValues().elementAt(3) ;
//String creator ="leer";//(String)doc.getColumnValues().elementAt(8) ;
String cat = (String)doc.getColumnValues().elementAt(4) ;
System.out.println("DOC ist da4") ;
String target = (String)doc.getColumnValues().elementAt(5) ;
String purpose = "Test";//(String)doc.getColumnValues().elementAt(6) ;
System.out.println("DOC ist da5") ;
StringBuffer sb = new StringBuffer() ;
System.out.println("DOC ist da6") ;
//System.out.println("creator2 : " + creator );
for( int i = 0 ; i < purpose.length() ; i++ )
{
char c = purpose.charAt(i) ;
int ii = (int) c ;
if( c == 0 )
{
sb.append((char)0x0A) ;
}
else
sb.append(c) ;
}
purpose = sb.toString() ;
System.out.println("Name: " + name) ;
if( planerDb.getRowNb(row) == -1 )
{
// nö, müssen wir es anlegen!!!
planerDb.addRow(row);
}
URL docURL = null ;
try{
docURL = new URL(doc.getURL()) ;
}
catch( Exception ex ) {}
String addString[] = new String[1] ;
addString[0] = target ;
Slot slot = new Slot(planerDb,notesDateStart,notesDateEnd,row,
name,purpose,docURL,addString,null,null );
String kind = cat ;
slot.id = doc.getUniversalID() ;
//System.out.println(doc.getUniversalID()) ;
Color c = planerDb.getColor( cat ) ;
String username = applet.getParameter("ReadOnlyName") ;
if(( username != null ) && ( username.length() > 0 ))
{
if( !username.equalsIgnoreCase(slot.getSubject()) )
//if( !username.equalsIgnoreCase(creator))
slot.setReadOnly(true);
}
if( c == null )
{
System.out.println("Kind \"" + kind + "\"is undefined!") ;
}
else
{
//System.out.println( c.getRGB() ) ;
slot.setColor( planerDb.getColor( kind )) ;
planerDb.addSlot( slot ) ;
}
doc1 = doc ;
doc = view.getNextDocument(doc) ;
doc1.recycle() ;
}
System.out.println("OK 295") ;
}
catch( Exception ex )
{
ex.printStackTrace() ;
}
System.out.println("Vorbei 303") ;
}
-
Code sieht an und für sich nicht schlecht aus, aber das was ich sehen will, sehe ich immer noch nicht. Interessant ist, greift vielleicht bereits ein anderer Thread auf die Notesdaten zu, während Sie erstellt werden. Sprich läuft der Planer schon während du ihm die Daten reinschiesst. Generell würde ich überlegen, dass ganze nicht in einem Applet zu machen sondern in einem Agenten und die grafische Ausgabe in ein eigenes Fenster. Damit habe ich im Gegensatz zu den Aplletvarianten bessere Erfahrungen gemacht.
Grüße
Ralf
-
tue da wenigsens ein System.out.println() rein oder ex.printStackTrace() in diese geschweiften Klammern. Das kann wirklich zu langen Suchaktionen führen!
Vielleicht siehst du die Ursache schon, wenn du das dort einfügtst.
Im übrigen würde ich daraus vermutlich mehrere Methoden wenn nicht gar Klassen machen.
Axel
-
ich sehen den Fehler da nicht: wenn NSD kommt printet er ja nichts mehr!!! ich schau mal nach ob ein andererer Thread am arbeiten ist!
-
das kann allerdings sein mit dem Thread. D.h. NSD und dein Programm laufen in 2 unterschiedlichen Threads .
Das hört sich nach einer sogenannten Race Condition an. Dh. bei parallel Threads ist nie wirklich sicher, wann welcher Thread wieviel CPU bekommt und dann kann es deshalb bei mehreren Tests über die gleichen Testdaten zu unterschiedlichen Ergebnissen kommen. Eben weil das Thread Scheduling nicht immer gleich ist.
Ist vermutlich eine Frage der richtigen Thread Methode (z.B. yield() oder sleep(), wait()/notify(), etc. an der richtigen Stelle. Tricky aber machbar.
s. z.B. Ende dieser Seite: http://www.dpunkt.de/java/Programmieren_mit_Java/Multithreading/3.html
-
Danke, das bringt Licht ins Dunkle
-
echt ???
bei mir nicht so richtig, habs mir nochmal flüchtig angeschaut.
Wo wird denn da mit dem zweiten Thread kommuniziert.
PlanerDatabase?
Aber du kennst das Programm auch besser.
Ich halte yield() für einen guten Kandidaten
Und mach wirklich deine Methoden kleiner. Zumindest als Ziel im Hinterkopf. Es hilft.
Gerade wenn ich in unbekannten Terrain bin, mach ich zwar auch manchmal lange Methoden, aber ich teil das dann irgendwann auf. Und das ist immer nur punktuell. Ich würd sonst irgendwann den Überblick verlieren und das macht keinen Spaß.