Lotus Notes / Domino Sonstiges > Java und .NET mit Notes/Domino
Mit java eine SessionFactory für Notes implementieren
Ralf_M_Petter:
Das Concurrent Framework wurde erst mit 1.5 eingeführt. Ich habe selber auch eine eigene Lösung programmiert. Aber wie gesagt richtige nebenläufige Programmierung ist extrem schwierig und deshalb werde ich in Zukunft auch verstärkt auf das Fix und fertig Framework von java setzen.
Ralf
flaite:
Das mit dem Concurrent Framework zu machen wär vermutlich eine gute Idee. Fragt sich nur, wenn man sowas schreiben soll.
Thomas,
ich mag die Idee eigentlich nicht, solche Connection Objekte mit einer fertigen Session in den Pool zu legen. Dann eher Sessions nicht schliessen und die im Pool zwischenparken.
Das mag ich eigentlich auch nicht.
Ich versuche solche Ressourcen immer möglichst kurz zu halten.
Erst wenn es performance-mässig überhaupt nicht anders geht, würd ich über solche Park-Lösungen überhaupt erst nachdenken.
Eine NotesSession ist für mich sowas wie ein InputStream und den parkt man ja auch nicht initialisiert in irgendwelchen Objekten.
Gruß Axel
sudsaat:
Hallo zusammen,
vielen Dank für euer Feedback.
Ich habe heute eine kleine Test-Suite über das Concurrent Framework entwickelt - wer es mal testen möchte, bitte an mich wenden (weiß nicht, ob ich das hier so einfach posten darf?)
@Ralf_M_Peter:
Der beiden Methoden verwendet ThreadPoolExecutor selbst für initialisierung und terminierung (also wenn der Pool gestartet und beendet wird).
@Pitiyankee:
Ich benötige das um einen schnellen Zugriff für synchrone Requests mit Rückmeldung an den "Verursacher" (beispielsweise einen Benutzer) zu gewährleisten. Das erstellen der Session kann u.U. schon mal 2-3 Sekunden benötigen, und die sind in dem vorgesehenen Kontext "sehr teuer". Ich entwickel viele Schnittstellenprogramme zwischen ERP-System, Workflow-Systemen, Archiv-Systemen etc. und dort versuche ich immer einen Pool mit Anmeldungen (was eine Session in Notes im Wesentlichen ja ist) vorzuhalten. Ich sehe also die Session nicht als InputStream sondern eher wie ein Verbindung in einem ConnectionPool für Datenbanken). Der Performance-Faktor ist immens und der Benutzer glücklich, wenn er anstatt ca. 10 Sekunden nur 0,2 Sekunden auf das Ergebnis wartet :-)
Ansonsten gebe ich dir recht, bei nicht zeitkritischen kleinen Anwendungn ergibt das wenig Sinn, da der Overhead (ist die "geparkte" session noch gültig oder serverseitig bereits geschlossen blabla ) alles wegfällt.
Ich bastel noch ein wenig weiter, nächstes Ziel ist die Session generisch über DIIOP, Internet, local etc. zu beziehen und den Thread-Pool über properties zu konifigurieren (großes Ziel ist eine Notes-Komponente für den direkten Einsatz für weitere Entwicklungen zu erstellen).
so long... Thomas :-)
PS: Sollte das in einen neuen Forums-Thread? Hat ja mit dem jetzigen nur noch bedingt zu tun.
sudsaat:
Update: Generische Factory ist fertig für IIOP und local - jetzt ist der Zeitpunkt mich mit meinem Problem "user is not a server" für internet-sessions zu befassen :-)
Grüße Thomas :-)
------------8<---------(snip)-------------------------------
Edit: den generischen teil werde ich noch ein wenig umstricken...
Kurz was anderes: Ich bekomme ab und an den Fehler:
Notes initialization failure - err 41728
ist bei IBM auch schon durch einen anderen Benutzer gemeldet. Kennt jemand diesen Fehler?
------------8<---------(snip)-------------------------------
Edit: Suche jemanden, der Bock hat, die kleine Komponente zu testen. Mich würde interessieren, ob der Fehler auch bei euch auftritt. JUnit-Testklassen für den Verbindungstest sind vorhanden für:
- GenericSessionFactory (über property konfigurierbar)
- LocalSessionFactory
- RemoteCorbaSessionFactory
- InternetSessionFactory
..eine Test-Suite für alle Tests gemeinsam.
Die InternetSessionFactory wirft aktuell leider den Fehler (user is not a server) bei mir (Notes 8.5.2). Wäre für einen Tester dankbar :-)
Weiter bekomme ich wie gesagt ab und an den Fehler:
Notes initialization failure - err 41728
Wäre auch interessant, wie sich das bei euch verhält?
Grüße Thomas :-)
------------8<---------(snip)-------------------------------
Update: Zwischenstand für potentielle Tester :-)
Die Komponenten ist bisher ein Geflecht aus 16 Klassen und bitet folgende Features:
- NotesThreadPooling über Concurrent-Framework
- 3 Zugriffsmodi (IIOP, http, local)
- Vorhalten einer neuen Session für jeden eintreffenden task
- Recycle der Session nach abgearbeitetem Task
- Konfiguration über property-file
- Junit-Tests (siehe oben)
- Testlauf mit zufälliger ABM :-)
Konfigurierbar sind bisher folgende Optionen:
--- Code: ---# access type (IIOP, http, local)
domino.access.type=local
# connection-properties
domino.access.fullAccess=false
domino.access.host=172.30.41.115
domino.access.sslActive=false
domino.access.user=easyxbase easyxbase/comdms
domino.access.password=topS3cr3t
domino.access.inetPassword=topS3cr3t
# Thread-Pool config
#
# domino.threadpool.size - set maximal count of workers for incoming tasks
#
domino.threadpool.size=2
--- Ende Code ---
Aktuell in Arbeit:
- generische Rückmeldung von Tasks nach getaner Arbeit über "Callable" statt "Runnable"
ich halte euch auf dem laufenden.
Grüße Thomas :-)
------------8<---------(snip)-------------------------------
Update: callables sind nun auch möglich, bin mir aber noch nicht sicher, wie ich mit der Rückmeldung der Future-Objekte umgehe?
Habe mal testweise 10.000 Tasks über den Thread-Pool mit 50 Threads abarbeiten lassen - sieht soweit gut aus.
------------8<---------(snip)-------------------------------
Update: sessionAchieve hinzugefügt. Über properties kann bestimmt werden, ob die worker (threads) eine erstellte session beibehalten oder nach jedem Task recyclen und neu initialisieren.
Die Komponente deckt jetzt folgende Szenarien ab (exemplarisch):
Single-Threaded mit einer Session:
domino.threadpool.size=1
domino.threadpool.sessionAchieve=true
Single-Threaded mit jeweils neuer Session:
domino.threadpool.size=1
domino.threadpool.sessionAchieve=false
Multi-Threaded mit einer session / thread für alle tasks:
domino.threadpool.size=50
domino.threadpool.sessionAchieve=true
Multi-Threaded mit jeweils neuer session / thread für alle tasks:
domino.threadpool.size=50
domino.threadpool.sessionAchieve=false
Muss mich jetzt anderen Themen widmen. Denke in der kommenden Woche werde ich folgende Themen angehen:
- Fehlerbehandlung über uncheckedExceptions
- Logging (evtl. über SLF4J)
Habe kein Feedback mehr erhalten, daher bin ich mir unsicher, ob das Thema von Interesse ist.
Falls nicht, bitte diesen Thread schließen.
Grüße Thomas :-)
sudsaat:
Die Komponenten verwendet jetzt SLF4J.
Im Paket wird aktuell Log4J als Logging-Framwework über SLF4J eingesetzt.
Grüße Thomas :-)
Navigation
[0] Themen-Index
[#] Nächste Seite
[*] Vorherige Sete
Zur normalen Ansicht wechseln