Lotus Notes / Domino Sonstiges > Java und .NET mit Notes/Domino

Mit java eine SessionFactory für Notes implementieren

<< < (2/6) > >>

flaite:

--- Zitat ---gerne die Session über die überladene static-Methode NotesFactory.createSession((String)null, user, pwd) erzeugen würde (da bekomme ich user is not a server?!? - dazu habe ich aber einen weiteren Thread hier eröffnet)

--- Ende Zitat ---
Wenn ich mich recht erinnere kommt der Effekt, wenn du
a) Client und Server auf dem selben Rechner installiert hast.
UND
b) der Server im PATH des OS vor dem Client steht. Im PATH vom Betriebssystem muss der Client vor dem Server erwähnt werden.

sudsaat:
Hallo zusammen,

ich brauche nochmal einen kleinen Gedankenanstoß für die Implementierung eines Thread-Pools.

Für das Java Concurrent-Framework habe ich mir einige Testklassen geschrieben, die soweit auch funktionieren:
- eine generische Pool-Factory die entscheidet ob Single-, Fixed- oder Cached-Pooling verwendet wird
- eine Test-Klasse MyNotesThread
- eine NotesThread-Factory für die initialisierung von MyNotesThread
- 2 Interfaces (MyNotesRunnable und MyNotesCallable für Rückmeldungen)

soweit so gut...

Wenn die Factory jetzt einen Thread erzeugt, kann ich dort beispielsweise die Session erzeugen und den Thread vorhalten bis ein "Worker" Arbeit liefert.

Das Concurrent-Framework übernimmt die Initialisieung und Wiederverwendbarkeit der Threads. Die Wiederverwendbarkeit der Threads ist gerade meine Denkblokade :-)

Folgender exemplarischer Code:

--- Code: ---ExecutorService executor = Executors.newFixedThreadPool(2, new NotesThreadFactory());

List<Future<Boolean>> list = new ArrayList<Future<Boolean>>();

for (int i = 0; i < 6; i++) {
Future<Boolean> submit = executor.submit(new NotesCallable() {

private Random generator = new Random();

@Override
public Boolean call() throws Exception {
long sleepTime = generator.nextInt( 10000 );
System.out.println("sleeping for " + sleepTime + " milliseconds");
Thread.sleep(sleepTime);
return true;
}
});

list.add(submit);
}

--- Ende Code ---

erzeugt über die NotesThreadFactory initial 2 Threads der Klasse "MyNotesThread". Der Konstruktur der Klasse übernimmt hier exemplarisch die initialisierung:


--- Code: ---public NotesThreadData(Runnable r) {
super(r);
try {
NotesThread.sinitThread();
session = NotesFactory.createSession();
System.out.println("Session initialized: " + session.hashCode());
} catch (NotesException e) {
e.printStackTrace();
}
}

--- Ende Code ---

und hält die session vor für die kommenden Worker.

Im obigen Beispiel werden 6 NotesCallable erzeugt, die parallel (immer 2 aktiv) abgearbeitet werden.

Wie schaffe ich es jetzt, dem Thread mitzuteilen nach jedem abgearbeiteten Worker die session zu recyclen, sTermTerm() aufzurufen und sich neu zu initialisieren?

Hab da gerade ne komplette Denkblockade und komme nicht weiter.

Freue mich auf eure Antworten.

PS: Wenn ich einen brauchbaren Stand habe, kann ich ihn auch gerne zum Test zur Verfügung stellen.

Grüße Thomas :-)

Noch was am Rande: Welche Funktionalität bietet die Klasse:
lotus.notes.addins.util.NotesThreadPool;

finde leider nichts brauchbares was diese Klasse betrifft?!?

MadMetzger:
Du könntest unter das Interface direkt eine Abstrakte Implemtierung hängen, die eine Templatemethode (Müsste eines der GoF-Patterns sein) enthält: (Ich glaube, dass es geschickter ist, die Inititialisierung vielleicht nicht im Konstruktor schon zu machen)


--- Code: ---public void run() {
initSession()
doWork()
terminateSession()
}

public void initSession() {
// initialisiere NotesSession
}

public terminateSession() {
// terminate NotesSession usw.
}

public abstract doWork()

--- Ende Code ---

In der Methode doWork passiert dann die eigentliche Arbeit.

Das Ganze aus dem Bauch heraus, ohne deinen Code im Detail zu kennen.

sudsaat:
Hallo MadMetzger,

vielen Dank für die schnelle Antwort, aber ich glaube wir reden ein wenig aneinander vorbei :-)

Mein Ziel ist (vereinfacht):
- Einen ThreadPool der x-Threads parallel abarbeitet (mit Concurrent kein Thema)
- Jeder Thread solle zumindest eine session (später auch db, usw.) vorhalten (also bereits initialisiert)
- Somit der Programmcode eines Worker (Runnable oder Callable) direkt ausgeführt werden ohne auf die initialisierung der Notes-Objekte zu warten
- Nachdem der Thread die Arbeit eines Workers beendet hat, soll er die Objekte recyclen und gleich für den nächsten Worker wieder initialisieren

..wenn ich es mit einem GoF-Pattern löse, erfolgt (wie in deinem Beispiel) die Initialisierung erst, wenn ein Worker-Objekt eingeliefert wird, d.h. diese Variante spart zwar Schreibarbeit was die Initialisierung und Terminierung angeht, dauert aber länger, da jeder Worker auf die Initialisierung warten müsste.

Hoffe ich habe es verständlich erklärt.

Hast Du hierzu eine Idee?

Problemstellung kurz zusammengefasst: Wie kann ein wiederverwendbarer Thread für kommende Worker immer eine neue Objekte (z.B. session) vorhalten?

Freue mich auf Feedback.

Grüße Thomas :-)

MadMetzger:
100%ig ist mir dein Modell noch nicht klar, aber natürlich kannst du das recyclen und neu initialisieren auch in der Methode terminateSession() machen. Diese hieße dann vielleicht sinniger recycleAndInitializeNew(). Das Templatemuster ginge dann trotzdem noch, denke ich. Oder ich habe gerade eine falsche Vorstellung von deinem Code. Lösbar ist deine Anforderung sicherlich, muss auch nicht die Templatemethod sein, die kam mir nur reflexartig in den Sinn, weil Teile bei der Abarbeitung immer gleich sind.

Wie sehen denn Pool, Thread und Worker usw ungefähr aus?

Navigation

[0] Themen-Index

[#] Nächste Seite

[*] Vorherige Sete

Zur normalen Ansicht wechseln