Autor Thema: NotesFactory  (Gelesen 5931 mal)

Offline thorsten_w

  • Junior Mitglied
  • **
  • Beiträge: 60
  • Geschlecht: Männlich
NotesFactory
« am: 09.01.06 - 11:56:49 »
Hallo *,

Ich hätte eine kleine Frage, die ist nicht existenziell, aber doch interessant.
Ich würde gerne Testläufe in unserem API durchführen und dabei Daten vom Domino Server benutzen. Dabei sollen die ensprechenden Klassen, die Sessions brauchen natürlich nicht extra auf eine Corba Session umgeschrieben werden.

Ich habe also eine globale Klasse erstellt, bei der sich dann jeder eine Session, die dann wahlweise über NotesThread oder Corba initialisiert wird.

Beispiel:
Code
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 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
	 */
	static private SessionFactory getInstance() throws ModuleException {
		if (SessionFactory.theInstance == null) {
			SessionFactory.theInstance = new SessionFactory();
		}

		return SessionFactory.theInstance;
	}

	/**
	 * @return
	 * @throws NotesModulException
	 */
	static public Session createSession() throws ModuleException {
		try {
			Session session = null;

			if (NotesThread.isLoaded) {
				session = NotesFactory.createSession();
			} else {
				SessionFactory factory = SessionFactory.getInstance();

				session = NotesFactory.createSession(
						factory.getHost(), 
						factory.getUser(), 
						factory.getPassword()
				);
			}

			return session;
		} catch (Exception e) {
			throw new ModuleException("can not get a session", e);
		}
	}
}


bei einem externen start passiert auf der Server Console folgendes:

Code
DIIOP Server: xxx.xxx.xxx.xxx connected
DIIOP Server: xxx.xxx.xxx.xxx connected
DIIOP Server: xxx.xxx.xxx.xxx connected
DIIOP Server: xxx.xxx.xxx.xxx connected
DIIOP Server: xxx.xxx.xxx.xxx connected
DIIOP Server: xxx.xxx.xxx.xxx connected
DIIOP Server: xxx.xxx.xxx.xxx connected
DIIOP Server: xxx.xxx.xxx.xxx disconnected
DIIOP Server: xxx.xxx.xxx.xxx disconnected
DIIOP Server: xxx.xxx.xxx.xxx disconnected
DIIOP Server: xxx.xxx.xxx.xxx disconnected
DIIOP Server: xxx.xxx.xxx.xxx disconnected
DIIOP Server: xxx.xxx.xxx.xxx disconnected
DIIOP Server: xxx.xxx.xxx.xxx disconnected

Die Frage ist: Steuert die NotesFactory die Connections über einen ORB - Pool ? Oder muss das selbst gemacht werden?

Gruss Thorsten

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: NotesFactory
« Antwort #1 am: 09.01.06 - 12:49:48 »
care-full.
Ich würd mir an deiner Stelle ernsthaft überlegen, diese 500 Dollar zu investieren.

http://www.looseleaf.net/looseleaf/lsihome.nsf/0/97e47c8b6e9ce59585256b19006415d1?OpenDocument

Lotus hat von Hause aus keinen ORB-Pool. Eine robustes Connection Pooling zu schreiben halte ich auch btw. für nicht gerade einfach. 
In diesem Text findest du zwar ein simples Beispiel (Abschnitt: Connection pooling)
http://www-128.ibm.com/developerworks/lotus/library/ls-Java_access_2/index.html
Jedoch halte ich diese Hinweise von Looseleaf auf Memory Leaks / stall connections für konkret keinen fun stuff.

UND: Les dir den Abschnitt Recyling in dem gleichen IBM Artikel durch. Wenn du kein recycle() benutzt, hast du schnell memory leaks.

Axel

Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline Ralf_M_Petter

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.879
  • Geschlecht: Männlich
  • Jeder ist seines eigenen Glückes Schmied
    • Ralf's Blog
Re: NotesFactory
« Antwort #2 am: 09.01.06 - 15:15:37 »
Hallo Thorsten!

Ich würde mir die 500 Dollar sparen und das schon mal selber implementieren, aber auf jeden Fall musst du deine Klasse Threadsafe kriegen. Was jetzt nicht der Fall ist, sonst kann es zu den seltsamsten Fehlern kommen, Vor allem wenn du die Klasse in einer J2EE Umgebung die logischerweise massiv Threads verwendet benutzt.

Grüße

Ralf
Jede Menge Tipps und Tricks zu IT Themen findet Ihr auf meinem Blog  Everything about IT  Eine wahre Schatzkiste sind aber sicher die Beiträge zu meinem Lieblingsthema Tipps und Tricks zu IBM Notes/Domino Schaut doch einfach mal rein.

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: NotesFactory
« Antwort #3 am: 09.01.06 - 15:33:37 »
Hallo Thorsten!

Ich würde mir die 500 Dollar sparen und das schon mal selber implementieren, aber auf jeden Fall musst du deine Klasse Threadsafe kriegen
... und überprüfen, dass die Session nicht idle  ist.
Nun gut. Es geht sicher, sofern das alles ist...


Gruß Axel
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline Ralf_M_Petter

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.879
  • Geschlecht: Männlich
  • Jeder ist seines eigenen Glückes Schmied
    • Ralf's Blog
Re: NotesFactory
« Antwort #4 am: 09.01.06 - 15:39:09 »
Das mit dem Überprüfen ob die Session IDLE ist macht das Looseleaf Tool auch nicht gerade effizient, vor allem Falls nämlich die Session nicht released wurde, was z.B. in einem Swing Client eventuell problematisch ist, wenn du immer sämtliche Domino Objekte verlierst zwischen jeder Transaktion.

Grüße

Ralf
 
Jede Menge Tipps und Tricks zu IT Themen findet Ihr auf meinem Blog  Everything about IT  Eine wahre Schatzkiste sind aber sicher die Beiträge zu meinem Lieblingsthema Tipps und Tricks zu IBM Notes/Domino Schaut doch einfach mal rein.

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: NotesFactory
« Antwort #5 am: 09.01.06 - 16:17:52 »
, was z.B. in einem Swing Client eventuell problematisch ist, wenn du immer sämtliche Domino Objekte verlierst zwischen jeder Transaktion.

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).
« Letzte Änderung: 09.01.06 - 16:28:51 von kennwort »
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline thorsten_w

  • Junior Mitglied
  • **
  • Beiträge: 60
  • Geschlecht: Männlich
Re: NotesFactory
« Antwort #6 am: 09.01.06 - 16:39:14 »
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

Offline Ralf_M_Petter

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.879
  • Geschlecht: Männlich
  • Jeder ist seines eigenen Glückes Schmied
    • Ralf's Blog
Re: NotesFactory
« Antwort #7 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.

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
Jede Menge Tipps und Tricks zu IT Themen findet Ihr auf meinem Blog  Everything about IT  Eine wahre Schatzkiste sind aber sicher die Beiträge zu meinem Lieblingsthema Tipps und Tricks zu IBM Notes/Domino Schaut doch einfach mal rein.

Offline thorsten_w

  • Junior Mitglied
  • **
  • Beiträge: 60
  • Geschlecht: Männlich
Re: NotesFactory
« Antwort #8 am: 09.01.06 - 17:12:34 »
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.

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

Offline thorsten_w

  • Junior Mitglied
  • **
  • Beiträge: 60
  • Geschlecht: Männlich
Re: NotesFactory
« Antwort #9 am: 10.01.06 - 10:46:00 »
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);
		}
	}
}

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" 

jemand eine Idee, in welcher JAR die versteckt ist?


Gruss Thorsten

Offline Ralf_M_Petter

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.879
  • Geschlecht: Männlich
  • Jeder ist seines eigenen Glückes Schmied
    • Ralf's Blog
Re: NotesFactory
« Antwort #10 am: 10.01.06 - 11:23:35 »
Hallo Thorsten!

Eine Dumme Frage hast du SSO überhaupt auf deinem Server eingerichtet. Für was brauchst du das bei deiner Anwendung überhaupt. Das macht doch nur Sinn, wenn ich mehrere Applikationsserver gemeinsam nutzen will. z.B. Domino und Websphere. Kannst du das etwas näher erklären.

Übrigens habe es wohlwollend zur Kenntnis genommen, dass du deine Klasse threadsafer gemacht hast.

Grüße

Ralf
Jede Menge Tipps und Tricks zu IT Themen findet Ihr auf meinem Blog  Everything about IT  Eine wahre Schatzkiste sind aber sicher die Beiträge zu meinem Lieblingsthema Tipps und Tricks zu IBM Notes/Domino Schaut doch einfach mal rein.

Offline thorsten_w

  • Junior Mitglied
  • **
  • Beiträge: 60
  • Geschlecht: Männlich
Re: NotesFactory
« Antwort #11 am: 10.01.06 - 12:27:59 »
Hallo Ralf,

Ja, SSO ist eingerichtet.
Diese Lösung soll, wie gesagt, keine dauerhafte Verbindung zwischen Applikationen herstellen.
Ich möchte mir Testroutinen schreiben, mit denen ich Komponenten meines API testen kann.

Trotzdem sollte es eine gute Verbindung sein, damit ich auch Performence testen kann.

Übrigens habe es wohlwollend zur Kenntnis genommen, dass du deine Klasse threadsafer gemacht hast.
Danke :)

Gruss Thorsten

Offline Ralf_M_Petter

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.879
  • Geschlecht: Männlich
  • Jeder ist seines eigenen Glückes Schmied
    • Ralf's Blog
Re: NotesFactory
« Antwort #12 am: 10.01.06 - 12:33:14 »
Hallo Thorsten!

Trotzdem ich bleibe dabei SSO bringt in deiner Klasse nichts, da du ja den Usernamen und Passwort sowieso hast. SSO bringt nur etwas wenn du dich mit dem Token bei einem ganz anderen System anmelden willst.



Grüße

Ralf
Jede Menge Tipps und Tricks zu IT Themen findet Ihr auf meinem Blog  Everything about IT  Eine wahre Schatzkiste sind aber sicher die Beiträge zu meinem Lieblingsthema Tipps und Tricks zu IBM Notes/Domino Schaut doch einfach mal rein.

Offline thorsten_w

  • Junior Mitglied
  • **
  • Beiträge: 60
  • Geschlecht: Männlich
Re: NotesFactory
« Antwort #13 am: 10.01.06 - 15:17:18 »
dann vielleicht so:

Code
....
	private ORB createOrb () throws ModuleException {
		try {
			
			if ((this.orb == null) && ((this.count++ % 10) == 0)) {
				this.orb = NotesFactory.createORB();
			}
			
			return this.orb;
		} catch (Exception e) {
			throw new ModuleException ("can not create orb", e);
		}
	}
	
	/**
	 * @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();
				
				session = NotesFactory.createSession(
						factory.getHost(), 
						factory.createOrb(),
						factory.getUser(),
						factory.getPassword());

			}

			return session;
                                } catch (ModuleException e) {
                                                throw e;
		} catch (Exception e) {
			throw new ModuleException("can not get a session", e);
		}
	}
....

Auf diese Art wird auch tatsächlich nur eine Connection aufgebaut und der weitere Verlauf ist schnell.
Allerdings stellen sich dann an anderer Stelle grössere Probleme.
Ohne Umbau, können die Sessions nicht recycled werden, da ich nach dem "Abholen" keine Möglichkeit habe mehr an das Objekt heranzukommen  :(

Wenn die Session mit NotesSession.createSession() erstellt wird, dann scheint sich der NotesThread um das recycling zu kümmern.

Gruss Thorsten
« Letzte Änderung: 10.01.06 - 15:24:08 von thorsten_w »

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz