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

Servlets, Notes-Agents, Java-Programme die auf Notes zugreifen und Java Threads

(1/3) > >>

Axel_Janssen:
Hi,

beginne diesen Thread, um zu versuchen ein bischen Klarheit in dieses Thema zu bringen. Deshalb sind wir hier.

Notes-Agenten starten keinen extra Thread. Kelleher 98 hat ein kurioses Beispiel mit einem awt-Programm in einem Agenten. Da läuft die awt-Gui in einem eigenen Thread. Das ist aber nicht der Normalfall.

Sobald man von einem Java-Programm ausserhalb von Notes auf Domino Objekte zugreift, dann liegt man die Notes-Kommunikation immer in einen eigenen Thread. Warum das so genau ist, weiss ich jetzt auch nicht so genau. Ich hab das mal irgendwo gelesen. Sicher. Nach schnellem überfliegen tendiere ich dazu, dass Rose Kelleher in ihrem Klassiker "Advanced Domino 5 Programming" aus dem Jahr 98, keine Antworten bzgl. des warums liefert. Werd mal woanders nachgucken.  

Bei Servlets wiederum ist es folgendermassen:
Das Servlet läuft immer innerhalb der Laufzeitumgebung Webcontainer (auch Servletengine bezeichnet).
Der Browser des Users sendet Requests grundsätzlich immer an den Webcontainer.
Der Webcontainer leitet die Requests an die Servlets weiter.
Ausserdem managed der Webcontainer die Servlets. Für einen neuen http-post (oder http-get) Request ruft der Container die entsprechende doGet oder doPost-Methode des Servlets in einem neuen Thread auf.
Der Servlet-Entwickler braucht sich dann gar nicht mehr um Thread-Handling zu kümmern. Das macht der Webcontainer nach bestimmten Regeln, die in verschiedenen Spezifikationen festgelegt sind. Implementierung dieser Funktionalität ist Sache des Web-Container Anbieters (Tomcat, Websphere, Weblogic, etc).

Der Entwickler kann sich ein Servlet immer als einzelnes Objekt vorstellen, das alle Requests verarbeitet. Ob es nicht wirklich vielleicht im Webcontainer mehrere Instanzen von einer Servlet-Klasse auf User-Anfragen warten, ist per Spezifikation nicht gesagt. Ich glaube viele Container-Hersteller arbeiten mit Servlet-Pools. Sicher ist für den Entwickler, dass es für jeden Request eben nicht 1 Servlet-Instanz gibt sondern sich mehrere Requests 1 Servlet-Instanz teilen.
Aus diesem Grund gelten Instanzvariablen nicht als Thread-Safe und solten nicht aus den doGet() und doPost() beschrieben werden (lesen ist o.k.). Das würde Chaos verursachen, da ja dann immer mehrere Threads auf 1 Instanzvariable schreiben.
Wenn man das an code ausprobiert wird das ganz offensichtlich.
Übrigens können Servlets auch das Interface SingleThreadModule implementieren. Dann ist per Spezifikation sichergestellt, dass pro einkommenden Request ein neues Servlet erzeugt wird. In der Praxis ist das aber performance-mässig  katastrophal, dass es nicht verwendet wird.

Die Tatsache, das die Servlet-Instanz speicherresident (so heisst das glaub ich) vorliegt, bringt performance-Vorteile.
Ausserdem gibt es bestimmte LifeCycle callbacks Methoden, die man benutzen kann. Bevor das Servlet auf über den Web-Container einkommende http-Requests wartet, ruft der Webcontainer genau 1 Mal die init() Methode auf. Hier können Instanzvariablen initialisiert werden, die dann später von den doGet() und doPost() Aufrufen gelesen werden können. Z.B. Datenbankverbindungen, oder moderner ConnectionPools (egal was Renegaten wie Till_21 auch immer behaupten mögen ;D).
Bevor das Servlet aus dem Webcontainer entfernt wird, ruft der Webcontainer genau 1 mal die destroy-Methode auf. Hier können dann Datenbankverbindungen geschlossen werden oder Pools geleert.

Also um Threads braucht (und soll) man sich gar nicht kümmern. Das regelt der Container. Dieses "automatische" Multithreading muss man aber als Entwickler kennen. Es hat nämlich Auswirkungen auf die Entwicklung. Explizit hier z.B. das man keine Instanzvariablen beschreiben kann.

auf fehler bitte aufmerksam machen
gibt keine dummen Fragen

Axel

Ralf_M_Petter:
@Axel

Das mit dem AWT im Agent verwende ich auch, das ist unter R5 ziemlich die einzige Möglichkeit  Java Guis mit Notes zu verquicken, vor allem wen man so wie du Java Applets für Tod erklärt.  ;D

Ebenfalls das mit dem eigenen Thread bei Java Programmen ist zumindest bei meinen bisherigen Programmen nicht so. Das einzige was man machen muß ist bei lokalen Zugriff wie bereits ein paar mal von mir beschrieben, dass ich den aktuell verwendeten Thread für Notes initialisieren muß. durch den Aufruf von NotesThread.sinitThread(). Das hängt irgendwie mit den C++ Objekten im Hintergrund zusammen.

Zu den Servlets wollte ich noch ergänzen, dass das sehr gut von dir beschriebene natürlich für alle von Servlet abhängigen Technologien ebenfalls gilt. z.B. JSP

Grüße

Ralf

Axel_Janssen:

--- Zitat von: Ralf_M_Petter am 27.06.03 - 08:01:02 ---... den aktuell verwendeten Thread für Notes initialisieren muß. durch den Aufruf von NotesThread.sinitThread().

--- Ende Zitat ---
oops. Ich dachte, dass würde im Hintergrund auch irgendwie einen neuen Thread erzeugen. Ist natürlich quatsch. Muss mir das mal irgendwo genau durchlesen.


--- Zitat ---...von Servlet abhängigen Technologien ebenfalls gilt. z.B. JSP

--- Ende Zitat ---
genau. JSPs sind nämlich einfach eine Technologie, wo die JSP Engine aus dem JSP-code Servlet-quellcode generiert und denselben dann kompiliert.
Dieses generierte Servlet wiederum bedient wie jedes andere Servlet User-Requests.
Man kann sich diese generierten Dateien angucken. In Tomcat liegen sie im Verzeichnis-Baum von Tomcat unterhalb von <Tomcat_Root>\work.

qojote:
Hi,
@Ralf_M_Petter,@Axel_Janssen

Zitat:

--- Zitat ---Das mit dem AWT im Agent verwende ich auch, das ist unter R5 ziemlich die einzige Möglichkeit  Java Guis mit Notes zu verquicken, vor allem wen man so wie du Java Applets für Tod erklärt
--- Ende Zitat ---


Kann mir dazu einer von euch ein Beispiel posten ??

Danke
Gruß
Qojote

Axel_Janssen:
leider nicht.
Auf Seite 271 von Rose Kellehers Buch Advanced Domino 5 Programming ist so ein Beispiel. Du erwartest jetzt nicht von mir, dass ich das abtippe, oder?

Leider ist der source nicht von ihrer webseite downzuloaden (oder ich habe ihn nicht gefunden: http://www.ramblingrose.com

Auch google search "Lotus Agent gui java" ergab kein Ergebnis.

Wofür brauchst du das?
Wenn es mehr zum lernen ist, würde ich mit Domino6 arbeiten. Java2 Unterstützung ist wirklich wichtig. Das macht richtig Spaß.

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln