Lotus Notes / Domino Sonstiges > Java und .NET mit Notes/Domino
Ralf, jemals versucht (Notes-)Database Obj in eigenen Thread zu cachen?
Ralf_M_Petter:
Hallo Axel!
Kannst du die ganze Konsolenausgabe mit Stacktrace posten. Ich würde nämlich schon sagen, dass das so funktioniert.
Grüße
Ralf
Axel_Janssen:
Kann es sein, dass es funktionieren könnte, wenn ich im Constructor einfach darauf verzichte
--- Code: ---NotesThread.stermThread();
--- Ende Code ---
aufzurufen? ??? >:( :(
Es sieht fast so aus, wobei ich noch weitere Probleme im code habe.
Das wäre natürlich gut. ;D
Dann hätte ich mir aber meine MultiThreading Forschung sparen können.
Gruß Axel
Ralf_M_Petter:
NotesThread.strerm nicht zu machen, hat sich bei mir nicht bewährt, immer wenn ich es einmal vergessen habe, hatte ich immer wieder plötzlich mal eine Schutzverletzung oder einen Red Box Fehler in Notes. Wie gesagt, ich verwende das ganz gleich wie du nur das mit den Threads was du erwähnst ist mir nicht ganz klar. Laufen die beiden Sachen in verschiedenen Threads?
Grüße
Ralf
Axel_Janssen:
--- Zitat von: Ralf_M_Petter am 29.07.03 - 15:48:59 ---Hallo Axel!
Kannst du die ganze Konsolenausgabe mit Stacktrace posten. Ich würde nämlich schon sagen, dass das so funktioniert.
Grüße
Ralf
--- Ende Zitat ---
hier ist alter Stacktrace:
--- Code: ---neueste
NotesException: Object has been removed or recycled
at lotus.domino.local.NotesBase.CheckObject(NotesBase.java:1063)
at lotus.domino.local.Document.getItemValueString(Unknown Source)
at de.aja.db.NotesConnection.getMAsData(NotesConnection.java:75)
at de.aja.gui.model.AbwesenheitTableModelApplet.retrieveNotesData(AbwesenheitTableModelApplet.java:88)
at de.aja.gui.TableAbwesenheit.doChangeWeek(TableAbwesenheit.java:328)
at de.aja.gui.TableAbwesenheit.cbWocheActionPerformed(TableAbwesenheit.java:241)
at de.aja.gui.TableAbwesenheit.access$100(TableAbwesenheit.java:27)
at de.aja.gui.TableAbwesenheit$2.actionPerformed(TableAbwesenheit.java:162)
at javax.swing.JComboBox.fireActionEvent(JComboBox.java:1196)
at javax.swing.JComboBox.setSelectedItem(JComboBox.java:561)
at javax.swing.JComboBox.setSelectedIndex(JComboBox.java:597)
at de.aja.gui.TableAbwesenheit.replaceSelectionWeeks(TableAbwesenheit.java:367)
at de.aja.gui.TableAbwesenheit.init(TableAbwesenheit.java:98)
at sun.applet.AppletPanel.run(AppletPanel.java:348)
at java.lang.Thread.run(Thread.java:536)
--- Ende Code ---
Die Zeile 75 war das:
--- Code: ---System.out.println(testDoc.getItemValueString("userNameAbb"));
--- Ende Code ---
Alls ich nun im Konstruktor das NotesStread.stermThread(); auskommentiert habe, treten diese Probleme offenbar nicht mehr auf.
Ralf_M_Petter:
Ich glaube ich verstehe das Problem jetzt.
Das NotesThread.sinitThread zieht ja nur für einen Thread. Wenn man einen Thread mit StermThread beendet, werden alle Objekte die in diesem Thread erzeugt worden sind beschädigt. Du musst deine Objekte die du cachen willst in einem Thread erzeugen, der weiterläuft. Während du im AWT Thread dann mit diesen Objekten arbeitest.
Habe das jetzt auch in der Hilfe gefunden:
When child objects are used on threads other than the parent, keep the parent thread alive until all child threads terminate. This is particularly important when using Domino Objects in AWT event handlers.
Ein Beispiel warum es bei mir funktioniert.
/*
* Test.java
*
* Created on 1. November 2002, 11:56
*/
package GuiComponents;
import lotus.domino.*;
import GuiComponents.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
/**
*
* @author petter_r
*/
public class Test {
static JDialog dialog;
static NotesTablePanel ntds;
/** Creates a new instance of Test */
public Test() {
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
try {
NotesThread.sinitThread();
Session session = NotesFactory.createSession();
Database cdb=session.getDatabase("","web.nsf");
Document doc=cdb.getDocumentByID("9BE");
ntds=new NotesTablePanel(session,cdb,doc,"Feld1g;Feld2;Feld3;Feld4","1;2;3;4","Feld1;Feld2;Feld3;Feld4","100");
dialog=new JDialog((Frame)null,"Test",true);
dialog.getContentPane().setLayout(new FlowLayout());
dialog.getContentPane().add(ntds,BorderLayout.CENTER);
JButton ok=new JButton("OK");
ok.setPreferredSize(new Dimension(100,25));
JButton abbrechen=new JButton("abbrechen");
abbrechen.setPreferredSize(new Dimension(100,25));
dialog.getContentPane().add(ok,BorderLayout.SOUTH);
dialog.getContentPane().add(abbrechen,BorderLayout.SOUTH);
dialog.pack();
ok.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e){
System.out.println("Ok wurde ausgewählt");
ntds.tableStopEditing();
dialog.dispose();
}
});
abbrechen.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e){
System.out.println("abbrechen wurde ausgewählt");
dialog.dispose();
}
});
dialog.show();
doc.save(true,false);
System.out.println("disposed");
session.recycle();
} catch(Exception e) {
e.printStackTrace();
}
finally{
NotesThread.stermThread();
}
}
}
Schwierig ist natürlich dann wo man wenn man keinen gebundenen Dialog wie in meinem Fall hat die Notes Objekte wie Session, DB, view usw erstellt. Ich würde empfehlen einen eigenen Thread dafür zu machen, den mit NotesThread.sinitThread initialisieren, die Objekte erstellen. denn Thread dann schlafenlegen bis zu einer Unterbrechung und wenn Programm fertig die Unterbrechung des Threads machen, damit er Session recyceln kann und das NotesThreadStermthread machen kann. Was hälst du davon?
Grüße
Ralf
Navigation
[0] Themen-Index
[#] Nächste Seite
[*] Vorherige Sete
Zur normalen Ansicht wechseln