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

Mit java eine SessionFactory für Notes implementieren

<< < (3/6) > >>

sudsaat:
Ich versuche das ganze an einem "out-of-the-box" beispiel klarzumachen.

Ist stark vereinfact, hoffe es ist alles drin und wird deutlich:

NotesThreadData sieht folgendermaßen aus:

--- Code: ---package out.of.the.box;

import lotus.domino.NotesException;
import lotus.domino.NotesFactory;
import lotus.domino.NotesThread;
import lotus.domino.Session;

public class NotesThreadData extends Thread {

private Session session = null;

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 ---

Diese werden von dieser Factory erzeugt:


--- Code: ---package out.of.the.box;

import java.util.concurrent.ThreadFactory;

public class NotesThreadFactory implements ThreadFactory {

public Thread newThread(Runnable r) {
return new NotesThreadData(r);
}
}

--- Ende Code ---

das ganze wird über einen ThreadPool gesteuert:


--- Code: ---package out.of.the.box;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class NotesThreadPool {

private static final int NTHREDS = 2;

private ExecutorService executorService = null;

public NotesThreadPool() {
executorService = Executors.newFixedThreadPool(NTHREDS, new NotesThreadFactory());
}

public void doSomeNotesWork(Runnable r) {
executorService.execute(r);
}

public void shutDown() {
// WeberT: make the executor accept no new threads and finish all existing threads in the queue
executorService.shutdown();

// WeberT: wait until all threads are finished
while (!executorService.isTerminated()) {}

System.out.println("Finished all threads");
}

}

--- Ende Code ---

Zum starten was passiert:

--- Code: ---package out.of.the.box;

public class Main {

public static void main(String[] args) {

NotesThreadPool pool = new NotesThreadPool();

for (int i = 0; i < 10; i++) {

pool.doSomeNotesWork(new Runnable() {
@Override
public void run() {
System.out.println("Runnable run");
}
});
}
pool.shutDown();
}

}

--- Ende Code ---

Beim Start werden für beide Threads eine Session initialisiert. Ich möchte, dass dies nach jedem Worker passiert (In diesem Beispiel sind die Worker simple Runnables).

Hoffe es wird deutlich.

Danke für die Unterstützung und verschneite Grüße
Thomas :-)

MadMetzger:
Okay, jetzt wird es ein wenig klarer. Vermutlich macht es Sinn die Methode run(), von der ich meine, dass sie run() auf dem im Konstruktor übergebenen Runnable aufruft, zu überschreiben: (nur eine grobe Skizze/Idee ohne zu probieren)

--- Code: ---@Override
public void run() {
    super.run();
    //session recycling and reinit
}
--- Ende Code ---

sudsaat:
Meinst du in etwa sowas:


--- Code: ---package out.of.the.box;

import lotus.domino.NotesException;
import lotus.domino.NotesFactory;
import lotus.domino.NotesThread;
import lotus.domino.Session;

public class NotesThreadData extends Thread {

private Session session = null;

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

@Override
public synchronized void start() {
System.out.println("start was called with session: " + session.hashCode());
super.start();
}

@Override
public void run() {
System.out.println("run was called with session: " + session.hashCode());
super.run();
}
}

--- Ende Code ---

das Problem hierbei ist, dass die run() Methode ebenfalls nur einmal aufgerufen wird, output beim ausführen:

Session initialized: 16112134
start was called with session: 16112134
Session initialized: 18508170
start was called with session: 18508170
run was called with session: 18508170
Runnable run
Runnable run
Runnable run
Runnable run
Runnable run
Runnable run
Runnable run
Runnable run
Runnable run
run was called with session: 16112134
Runnable run
Finished all threads

ne idee?

vielleicht ein eigener ExecutorService implementieren, um die Threads dort zu initialisieren?

Danke und Grüße Thomas :-)

Edit: Ich ziehe mir gerade die Java-Sourcen und schaue mir die Implementierung des ExecutorService an - der könnte dann auch gleich zu beginn n-Threads initial erstellen bevor die ersten Worker vorbeischauen.

Ralf_M_Petter:
Mein Meinung nach musst du einen ThreadPoolExceutor http://download.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ThreadPoolExecutor.html#terminated%28%29 verwenden und dort die Methoden initialize und terminate überschreiben. Diese sind doch für das einrichten und terminieren des Threads zuständig.

Grüße

Ralf

MadMetzger:
Ich wusste gar nicht, dass Java schon was in der Art mitbringt, man lernt nie aus. Vermutlich ist das sogar noch sinnvoller, als wenn du das komplett selbst schreibst. Wozu das Rad zweimal erfinden...

Navigation

[0] Themen-Index

[#] Nächste Seite

[*] Vorherige Sete

Zur normalen Ansicht wechseln