Lotus Notes / Domino Sonstiges > Java und .NET mit Notes/Domino
NotesFactory
flaite:
--- Zitat von: Ralf_M_Petter am 09.01.06 - 15:39:09 ---, was z.B. in einem Swing Client eventuell problematisch ist, wenn du immer sämtliche Domino Objekte verlierst zwischen jeder Transaktion.
--- Ende Zitat ---
Ich würd dazu tendieren zu denken, dass man bei jeder Transaktion frische Notes-Objekte aus dem Pool holt, sie also nicht clientseitig cached?
Vielleicht noch Database dazu-cachen, weil dies ein ziemlich kostspielig zu erzeugendes Objekt ist? (falls ich mich recht erinnere).
thorsten_w:
Vielen Dank ihr beiden.
Ich wollte damit nicht all zu viel Aufwand betreiben.
Im Normalfall ist ein NotesThread geladen und es läuft alles über den normalen Weg.
Die Corbaverbindung ist für Testfälle, wo auf einem Client über eine Main bestimmte Bereiche gechecked werden sollen. Ist also nicht für den Dauerbetrieb gedacht.
Der Gedanke mit dem ORB - Pool kam mir, da es relativ lange dauert bis Daten von dem Server verarbeitet sind.
Aber das mit dem Recyling werde ich mir noch angucken.
Wobei sich mir jetzt die Frage stellt, was passiert, wenn man eine "normal" geholte Session recyled. Geht dann der nächste NotesFactory.createSession() schief?
Gruss Thorsten
Ralf_M_Petter:
Weiss jetzt nicht genau, was du unter einer einer normal geholten Session verstehst, aber Wenn du eine Session mit CreateSession erstellst, ist das immer eine neue Session und nie eine bestehende, deshalb solltest du mit recycle auch keine Probleme haben.
Die Frage ist, warum brauchst du überhaupt so viele Sessions. Hast du soviele Threads oder was?
Meiner Meinung nach, ist eine neue Session nur notwendig, wenn ich die Session in einem anderen Thread verwenden will.
Grüße
Ralf
thorsten_w:
--- Zitat von: Ralf_M_Petter am 09.01.06 - 16:46:42 ---Weiss jetzt nicht genau, was du unter einer einer normal geholten Session verstehst, aber Wenn du eine Session mit CreateSession erstellst, ist das immer eine neue Session und nie eine bestehende, deshalb solltest du mit recycle auch keine Probleme haben.
--- Ende Zitat ---
Jetzt hab ich ja beinahe angst bekommen :)
Nein, Nein, das ist schon pro Thread eine Session.
Ich habe das grad gecheckt. In diesem Fall scheint die NotesFactory vernünftig zu arbeiten.
Wenn man mit NotesFactory.createFactory() eine Session holt, dann ist es immer die Session aus dem aktuellen NotesThread. (hab mir den Hashcode ausgeben lassen. Ist pro run immer der selbe).
Eine solche Session meine ich mit "normal" in einem AgentThread geholte Session.
Gruss Thorsten
thorsten_w:
Ausgehend von dem SSO Beispiel der IBM habe ich diese Anpassung gemacht.
--- Code: ---package testing;
import java.io.FileInputStream;
import java.util.Properties;
import lotus.domino.NotesFactory;
import lotus.domino.NotesThread;
import lotus.domino.Session;
/**
* @author tsw
*
*/
public class SessionFactory {
/**
*
*/
static private SessionFactory theInstance;
/**
*
*/
private String token;
/**
*
*/
private Properties properties;
/**
*
*/
private SessionFactory() throws ModuleException {
try {
this.properties = new Properties();
this.properties.load(new FileInputStream("factory.properties"));
} catch (Exception e) {
throw new ModuleException ("can not load properties", e);
}
}
/**
* @return
*/
private String getHost() {
return this.properties.getProperty("host");
}
/**
* @return
*/
private String getUser() {
return this.properties.getProperty("user");
}
/**
* @return
*/
private String getPassword() {
return this.properties.getProperty("password");
}
/**
* @return Returns the token.
*/
private String getToken() {
return token;
}
/**
* @param token The token to set.
*/
private void setToken(String token) {
this.token = token;
}
/**
* @return
*/
static private SessionFactory getInstance() throws ModuleException {
if (SessionFactory.theInstance == null) {
SessionFactory.theInstance = new SessionFactory();
}
return SessionFactory.theInstance;
}
private void initSession() throws ModuleException {
try {
Session session = NotesFactory.createSession(
this.getHost(),
this.getUser(),
this.getPassword());
this.setToken(session.getSessionToken());
session.recycle();
} catch (Exception e) {
throw new ModuleException ("can not init a session", e);
}
}
protected void finalize () {
try {
if (this.getToken() != null) {
Session session = NotesFactory.createSession(
this.getHost(),
this.getToken());
session.recycle();
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* @return
* @throws NotesModulException
*/
synchronized static public Session createSession() throws ModuleException {
try {
Session session = null;
if (NotesThread.isLoaded) {
session = NotesFactory.createSession();
} else {
SessionFactory factory = SessionFactory.getInstance();
if (factory.getToken() == null) {
factory.initSession();
}
session = NotesFactory.createSession(
factory.getHost(),
factory.getToken());
}
return session;
} catch (Exception e) {
throw new ModuleException("can not get a session", e);
}
}
}
--- Ende Code ---
allerdings kann ich diese nicht testen, da ich beim Start diese Meldung bekomme:
--- Code: ---java.lang.NoClassDefFoundError: org/omg/SecurityLevel2/Credentials
at lotus.domino.NotesFactory.createSession(NotesFactory.java:256)
at lotus.domino.NotesFactory.createSession(NotesFactory.java:276)
at testing.SessionFactory.createSession(SessionFactory.java:119)
at testing.Check.main(Check.java:12)
Exception in thread "main"
--- Ende Code ---
jemand eine Idee, in welcher JAR die versteckt ist?
Gruss Thorsten
Navigation
[0] Themen-Index
[#] Nächste Seite
[*] Vorherige Sete
Zur normalen Ansicht wechseln