Das Notes Forum

Lotus Notes / Domino Sonstiges => Java und .NET mit Notes/Domino => Thema gestartet von: Sanjou am 23.10.06 - 08:45:36

Titel: Parameter an Java gehen verloren
Beitrag von: Sanjou am 23.10.06 - 08:45:36
Hallo. Nochmal eine kurze Frage...

ich habe einen Java Agenten, der aus Notes 7 heraus eine Java Applikation startet. Als Parameter gebe ich die Session und eine Database mit weil ich in weiteren Funktionen noch Zugriff auf Objekte in der Datenbank benötige. Das Problem ist aber, das sobald der Java - Agent durchgelaufen ist, die Objekte Session und Database den Wert null haben. Gibt es eine Möglichkeit, die Inhalte davon zu behalten?

Der Aufruf aus Notes heraus ist der folgende:

//xGErDa - Applikation starten...   
gerda = mainpackage.GERDA.getInstance(session, db).Win1;

Und irgendwie muss ich die Inhalte von session und db für anderen Funktionen zur Verfügung stellen...

Hat einer einen Idee? Bin absoluter Neuling auf dem Gebiet...

Schonmal vielen Dank für die Mühe.
Titel: Re: Parameter an Java gehen verloren
Beitrag von: umi am 23.10.06 - 12:26:37
Da hast du aber ein kleines Problem.
Sobald dein Java Agent durchgelaufen sind, werden die entsprechenden C-Objekte recycled und sind somit für JAVA unbrauchbar.

Entweder muss dein Agent jetzt solange warten, bis Deine Applikation durchgelaufen ist, oder deine  Applikation muss die DB auf anderem Wege holen.
Titel: Re: Parameter an Java gehen verloren
Beitrag von: Ralf_M_Petter am 23.10.06 - 12:41:28
Hm die Antwort von Umi ist nur bedingt richtig, denn abgesehen dass die Javaobjekte sterben soll man überhaupt keine Threads starten, die über den Agent hinaus aktiv bleiben. Eventuell könnte der Fragesteller einmal genauer erklären, was wie funktionieren soll dann kann man ihm auch raten wie man das am besten bewerkstellt. Falls es sich wirklich um eine aufzurufende Applikation mit eigenem UI handelt würde ich es sowieso nicht in der Jvm von Notes sondern in einer externen laufen lassen.

Grüße

Ralf
Titel: Re: Parameter an Java gehen verloren
Beitrag von: Sanjou am 23.10.06 - 13:00:06
Es soll folgendes passieren:

ich markiere eine bestimmte Anzahl von Daten - meist Personen - die ich als Document Collection an eine Java Applikation übergebe. Diese sollen in Form von Knoten als Beziehungsnetzwerk dargestellt werden. Jetzt soll es möglich sein, zu einem Knoten - z.B. einer Person - direkte Beziehungen nachzuladen, das heißt ich muss wieder auf die Datenbank zugreifen, und alle Objekte die in Verbindung mit dieser Person stehen nachladen...

also mir bleibt wohl nichts anderes übrig als die Daten per String zu übergeben, oder? Ich hatte gehofft, das es möglich wäre, die Daten irgendwie am Leben zu erhalten....
Titel: Re: Parameter an Java gehen verloren
Beitrag von: flaite am 23.10.06 - 14:39:19
Grundsätzlich wäre es von meinem Verständnis besser, wenn die Java Anwendung sich die Session von der Notes Datenbank pullen würde.
Du kannst ja von einer beliebigen Java Anwendung Verbindung mit Domino aufnehmen.

Die entsprechende Verbindungsmethode sieht bei mir so aus:
Von nSession die Database zu bekommen ist nicht so schwierig.
Ich mach das in der referenzierten Methode doSpecificAction(Session nSession);



Code
/**
	 * 
	 * @return for reporting purposes.
	 */
	public ReportUser doAction() {

		try {
			
			tLocal = new ThreadLocal();
			tLocal.set(new ReportUser());
/*			if (getProp("useIIOP").toString().equals("true")) {
				isCorba = true; 
			} else {
				isCorba = false; 
			}
*/
                       isCorba = false

			if (isCorba) {
				nSession = NotesFactory.createSession(server + ":" + iiopPort);
			} else {
				NotesThread.sinitThread();
				nSession = NotesFactory.createSession();
			}
			
			ReportUser reportUser = doSpecificAction(nSession);
			
			
			nSession.recycle();
			if (!isCorba) {
				
				NotesThread.stermThread();
			}
			
			return reportUser;

		} catch (Throwable t) {

			t.printStackTrace();
			if (nSession != null)
				try {
					nSession.recycle();
				} catch (NotesException e) {
					// catch not needed here!

				}
			nSession = null;

			throw new RuntimeException(t);
			// TODO

			// return new StringBuffer().append("an error has occured");

		}

	}

Das ThreadLocal Gehampel ist zugegebenermassen ziemlich posermässig. Du brauchst das nicht für standalone Anwendungen. Für Serveranwendungen (du willst aus JBoss oder Tomcat auf Domino zugreifen) ist das aber ein guter Ansatz.

Um nicht so oft nach dem Passwort gefragt zu werden hilft (fürs erste) das Häckchen
"Don't prompt for a password from other Notes based programs" -> Es kommt keine Abfrage, wenn sich der Anwender schon in sein lokales Notes eingelogt hat, sicherheitsproblematisch ist es also aus meiner Sicht nicht.

aus: Notes Menü: File\Security\User-Security 1. Tab: Security Basics.