Autor Thema: Eigenständiger Java Thread  (Gelesen 6690 mal)

Offline thorsten_w

  • Junior Mitglied
  • **
  • Beiträge: 60
  • Geschlecht: Männlich
Eigenständiger Java Thread
« am: 13.12.05 - 11:36:45 »
Hallo *,

Ich habe dieses Forum über Google gefunden.
Für mein Problem scheint es viele Seiten zu geben, aber nirgenwo steht genau, ob und wie es geht. Also hoffe ich hier Hilfe zu finden.

Gibt es eine Möglichkeit einen eigenständigen Java Thread in der VM vom HTTP-Task unabhängig von dem Domino API zu starten?

Der Thread muß in der gleichen VM sein, da dort mehrere Singletons sind, die via schedule angesteuert werden sollen.

Wenn man einen Agenten dazu benutzt um einen solchen Thread zu starten liefert der Server folgende Meldung: HTTP JVM: Error cleaning up agent threads.

Oder gibt es vielleicht eine Möglichkeit, einen Task ausserhalb des HTTP-Task zu starten und dieser dann die VM des HTTP-Task benutzt?

Gruss Thorsten
« Letzte Änderung: 15.12.05 - 18:09:11 von thorsten_w »

Offline Ralf_M_Petter

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.879
  • Geschlecht: Männlich
  • Jeder ist seines eigenen Glückes Schmied
    • Ralf's Blog
Re: Eigenständiger Java Thread
« Antwort #1 am: 13.12.05 - 13:23:15 »
Hallo Thorsten!

Kann mir jetzt zwar nicht vorstellen, warum du sowas willst. Eventuell gibst du mehr infos, aber ich denke eventuell hast du eine Chance über dieses Uralt Servlet Ding von Domino. Näheres dazu findest du in der Hilfe.

Ob das jetzt die selbe JVM wie die Webagenten verwenden habe ich nicht geprüft.

Grüße

Ralf
Jede Menge Tipps und Tricks zu IT Themen findet Ihr auf meinem Blog  Everything about IT  Eine wahre Schatzkiste sind aber sicher die Beiträge zu meinem Lieblingsthema Tipps und Tricks zu IBM Notes/Domino Schaut doch einfach mal rein.

Offline thorsten_w

  • Junior Mitglied
  • **
  • Beiträge: 60
  • Geschlecht: Männlich
Re: Eigenständiger Java Thread
« Antwort #2 am: 13.12.05 - 13:38:23 »
Hallo Ralf,

Danke dir für deine Antwort.
Es handelt sich um ein doch schon etwas komplexeres Portal mit Domino als Applikationsserver.

Es müssen zeitabhängig Verbindungen zu Mysql gekappt werden und der Cache von Property-Dateien erneuert werden.

Ich suche eine andere Möglichkeit, um mich nicht auf die "relativ" unzuverlässige schedule Steuerung des Agent Managers verlassen zu müssen.

Ich werde mir die Sache mit den Servlets genauer angucken.

Danke für den Tip.


Gruss Thorsten

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Eigenständiger Java Thread
« Antwort #3 am: 13.12.05 - 13:48:09 »
Verstehe ich ehrlichgesagt auch nicht (und es würde mich interessieren).
Warum musst du die Connection zu MySQL über einen Request offenhalten?
Ich halte so eine Art von Connection Management ohne Netz für grundsätzlich gefährlich.
Domino wird wohl versuchen die child Threads zu schliessen.
Gibt ja auch unterschiedliche Connection Pool Lösungen. U.a. auch eine in Jakarta Commons. Vielleicht hilft das. 
Wofür brauchst du das?
« Letzte Änderung: 13.12.05 - 13:50:06 von kennwort »
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline thorsten_w

  • Junior Mitglied
  • **
  • Beiträge: 60
  • Geschlecht: Männlich
Re: Eigenständiger Java Thread
« Antwort #4 am: 13.12.05 - 13:58:47 »
Nein es geht nicht darum, die Connections offen zu halten.
Sie müssen geschlossen werden.

Über die Connections läuft im Tagesbetrieb teilweise sehr viel Trafic, darum werden die Connections in einem Hashtable gecached (um die Performence zu erhöhen) und über den java.sql.DriverManager verwaltet.

Nur werden die Connections nicht geschlossen, wenn der Traffic sinkt.

Gruss Thorsten

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Eigenständiger Java Thread
« Antwort #5 am: 13.12.05 - 14:43:22 »
Normalerweise schliesst man eine Connection zu einer Datenbank in der Methode, in der man sie öffnet (oder man ist wirklich ernsthafter Frameworkprogrammierer und kennt sich wirklich mit so Zeugs wie ThreadLocals usw. aus).
Oder man benutzt einen Connection Pool, der diese komplexe Aufgabe für einen regelt und den man nicht selber programmieren muß, weils das schon gibt.
Das Problem ist nur, dass du eine Art globales Singleton haben mußt, das für alle Notes Agenten erreichbar ist und genau das ist schwierig.
Hast du dir mal überlegt, die Connections über RMI zu managen?
D.h. Du lässt eine Connection-Pool Anwendung auf einem RMI-Server laufen und du besorgst dir von dort die Connections von Domino aus?
Oder wie wärs mit Websphere. Die Einstiegsversion ist ja Lizenzmässig für Domino mit bei und da auch ein bereits fertig programmierter Connection Pool Mechanismus, den du über jndi ansprechen kannst und der gut dokumentiert sein sollte?

Die einzige Chance, die ich für selbstgedrehtes Threading sehe, bestehen in Daemon Threads (http://www.dpunkt.de/java/Programmieren_mit_Java/Multithreading/8.html). Ich würd mich nur sehr wundern, wenn Domino das zulassen würde.
Und... wie willst du später eine Referenz darauf bekommen.
Normal würd man ja davon ausgehen, dass man jede DatenbankConnection, die man in einem Notes Agent Call öffnet auch wieder schliesst. (kann man nicht oft genug sagen  ;D )
Natürlich ist das Erstellen der Connection eine kostspielige Operation und deshalb gabs ja in J2EE sehr früh diese Connection Pools.
In Domino ist das nur sehr schwer zu nutzen, da es keine globalen Objekte gibt, deren Lebenszyklus die Laufzeit der Anwendung umfasst wie z.B. ServletContext http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/ServletContext.html .

Ralfs Idee die alte Domino Servlet Engine auszukramen halte ich für auf jeden Fall bedenkenswert. Da hast du einen globalen Objektspace, der während der gesamten Laufzeit der Anwendung im Zugriff ist und lebt.

VORSICHT MIT OFFENEN CONNECTIONS.
V.a. musst du auch checken, dass diese nicht stalled sind usw.
Wie gesagt: Für genau so ein performantes und qualitätssicherndes Zeugs wie das hier gibts eben die ganze J2EE Platform mit ihren Produkten.

Axel
« Letzte Änderung: 13.12.05 - 14:59:56 von kennwort »
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline thorsten_w

  • Junior Mitglied
  • **
  • Beiträge: 60
  • Geschlecht: Männlich
Re: Eigenständiger Java Thread
« Antwort #6 am: 13.12.05 - 15:00:19 »
Ich gebe dir in allen Punkten (bis auf einen, dazu unten) recht.

Ich habe nur leider den Domino Server 6.5 mit seiner JVM 1.3.
Ein update auf J2 oder gar auf Websphere ist nicht möglich (ist geplant... wird aber bis ende nächstes Jahr ganz sicher nichts).

RMI wäre evtl. eine Möglichkeit ich mach mich da mal etwas schlauer.

Ansonsten werde ich mir Pool Mechanismus selbst bauen müssen, solange ich niemanden finde, der ihn für Java 1.3 schon geschrieben hat.

Zitat
VORSICHT MIT OFFENEN CONNECTIONS.
V.a. musst du auch checken, dass diese nicht stalled sind usw.
Wie gesagt: Für genau so ein performantes und qualitätssicherndes Zeugs wie das hier gibts eben die ganze J2EE Platform mit ihren Produkten.

Damit bin ich voll bei dir. Nur sitzt mir die Performence dick im Nacken.


Globale Singletons, welche von allen Agenten erreicht werden können, existieren schon.
Diese werden beim ersten Aufruf initialisiert und existieren solange der HTTP Task läuft.

Ich habe inzwischen auch die Idee von Ralf ausprobiert und sie funktioniert gut.

Ein Problem hab ich allerdings noch :)
Wie rufe ich dieses Servlet zum start des Http tasks auf?

Beziehungsweise, wann das Init am Servlet aufgerufen?
Erst, wenn es im Browser aufgerufen wird? Oder schon, wenn es vom HTTP initialisiert wird?

Offline Ralf_M_Petter

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.879
  • Geschlecht: Männlich
  • Jeder ist seines eigenen Glückes Schmied
    • Ralf's Blog
Re: Eigenständiger Java Thread
« Antwort #7 am: 13.12.05 - 15:10:59 »
Ich denke, dass Servlet wird erst beim ersten Zugriff geladen und initialisiert.

Eine Möglichkeit wäre es, von deinen Java Initialisierungsroutingen beim Start de HTTP Servers einfach das Servlet über eine HTTP Verbindung aufzurufen. Ich muß aber Axel rechtgeben, dass ist schon alles ein ziemlicher Hack.

Grüße

Ralf
Jede Menge Tipps und Tricks zu IT Themen findet Ihr auf meinem Blog  Everything about IT  Eine wahre Schatzkiste sind aber sicher die Beiträge zu meinem Lieblingsthema Tipps und Tricks zu IBM Notes/Domino Schaut doch einfach mal rein.

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Eigenständiger Java Thread
« Antwort #8 am: 13.12.05 - 15:27:39 »
Ich habe nur leider den Domino Server 6.5 mit seiner JVM 1.3.
Java1.3 ist Java2. Java2 fing mit Java1.2 an.

Es gibt verschiedene vorhandene Pool-Lösungen. Such mal unter Connection Pooling Java1.3 in Google. Müssen aber etwas ältere Dokumente sein. Modernes beruht auf Java1.4 oder 5.   

Zitat
Wie rufe ich dieses Servlet zum start des Http tasks auf?
Mit Servlets benutzt du besser das Objekt ServletContext. Das sollte schon in der Domino ServletImplementierung dabei sein. Das ist ein globaler Objektraum für alle Servlets deiner Anwendung & Singleton.

init() wird beim ersten Aufruf des Servlets aufgerufen und nur genau einmal. Egal wie oft in diesem Servlet doGet() oder doPost aufgerufen wird. init() wird garantiert vor der ersten service Methode (doGet, doPost) aufgerufen. Du kannst dir aber nicht ganz sicher sein, wie viele Servlet-Instanzen gebildet werden. Normalerweise sollte 1 Objekt pro Servlet Klasse geben. Das lebt dann, solange die ServletEngine läuft. Wie gesagt ist es aber besser, ServletContext als gemeinsamen Objektspace zu nutzen.
Eventuell gibt es auch ini-Parameter, die bewirken, dass init() beim Hochfahren der Servletengine aufgerufen wird. Zumindest gibts sowas in modernen ServletContainern.

Dann dürfte auch die http-Task Lösung nicht notwendig sein. Wie hast du das gemacht?  ??? Respekt.


« Letzte Änderung: 13.12.05 - 15:48:55 von kennwort »
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline thorsten_w

  • Junior Mitglied
  • **
  • Beiträge: 60
  • Geschlecht: Männlich
Re: Eigenständiger Java Thread
« Antwort #9 am: 13.12.05 - 16:09:41 »
oh .. kleiner fehler... j1.3 ist j2. sry,

Vielleicht sollte ich mal kurz das Umfeld erklären, vielleicht wird damit mein Problem klarer und vielleicht habt ihr eine Idee für eine andere Lösung.

Es gibt einem Fragenpool in einer Mysql-Datenbank.
Dieser Fragenpool hat eine n tiefe der Kategoriesierung hier mal als Beispiel 3 Ebenen mit 3 Fragen und je 2 Antworten.

1. Kategorie
   2. Kategorie
      3a. Kategorie
         1. Frage
            1. Antwort
            2. Antwort
         2. Frage
            1. Antwort
            2. Antwort         
         3. Frage
            1. Antwort
            2. Antwort
      3.b Kategorie
         1. Frage
            1. Antwort
            2. Antwort
         2. Frage
            1. Antwort
            2. Antwort         
         3. Frage
            1. Antwort
            2. Antwort

Jedes Objekt ist natürlich in sich gekapselt.
Zugriffe innerhalb des API werden über eine Factory geregelt und die Kommunikation erfolgt ausschließlich über Interfaces.
Der Grund dafür: Es soll die Mysql-Datenbank wahlweise gegen jede beliebige relationale Datenbank ausgetauscht werden können
beziehungsweise eine Notes-Datenbank gegen Mysql.

Um nicht für jedes Objekt eine Connection zu öffnen (allein in dem oberen Beispiel wären das 22 Verbindungen) muss es ein globales Objekt geben, von dem bei Bedarf eine Verbindung abgeholt werden kann ohne, das sie erst geöffnet werden muss.

Das wird derzeit über einen Singleton realisiert, der aber (wie ich im Anfangsproblem beschrieb) offene Connections zurück läßt.

Wie Axel schon sagte, offene Verbindungen sind gefährlich (kann man nicht oft genug betonen :D).
Mein Problem ist es jetzt eine gute Lösung zu finden ohne das gesamte API um zu schreiben.

Ich habe auch schon darüber nachgedacht, mit dem Start einer AgentBase eine entsprechende Verbindung zu initialisieren aber da ist mir noch keine vernünftige Realisierung eingefallen.

Gruss Thorsten
« Letzte Änderung: 13.12.05 - 19:42:08 von thorsten_w »

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Eigenständiger Java Thread
« Antwort #10 am: 13.12.05 - 16:34:03 »
Aber du holst dir jedes Objekt mit 1 SQL Call ab?
n-tiefe Kategorisierungen in RDBMS ist natürlich auch nicht gerade unbedingt einfach, aber imho weichst du zu weit von der Orthodoxie ab.
Kann man sich die Fragen zu 1 Katalog nicht irgendwie mit 1 SQL Query rüberholen und da irgendwie cachen?
Es sind in den letzten Jahren eine Menge Sachen zu OO-RDBMS Mapping geschrieben worden (Frameworks und Texte). Deshalb würde ich es niemals wagen, dort etwas eigenes zu schreiben. Aus Notes ist natürlich sowas wie Hibernate oder Ibatis SQL Maps nicht nutzbar.
Ich würd aber trotzdem versuchen dir mit 1 SQL Query möglichst viele Objekte zu ziehen.
Beliebt ist in diesem Zusammenhang immer der Hinweis auf das DAO Pattern  ;D
Bedenke, dass ein SQL Query immer einen remote-Zugriff auf einen Datenbankserver darstellt. Durch die Latenz usw. wird deine Anwendung inperformanter. 

Man kann das DAO Pattern übrigens auch dafür nutzen, um gemeinsame Queries gegen Notes und RDBMS zu bauen. Grundsätzlich kanns also nicht sein.
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline thorsten_w

  • Junior Mitglied
  • **
  • Beiträge: 60
  • Geschlecht: Männlich
Re: Eigenständiger Java Thread
« Antwort #11 am: 14.12.05 - 08:28:09 »
Zitat
Aber du holst dir jedes Objekt mit 1 SQL Call ab?

Nein, das ganze ist schon effizienter gemacht.
Um den oben gezeigten Baum zu laden werden genau 9 Calls benötigt.

Gruss Thorsten.


Offline thorsten_w

  • Junior Mitglied
  • **
  • Beiträge: 60
  • Geschlecht: Männlich
Re: Eigenständiger Java Thread
« Antwort #12 am: 14.12.05 - 14:09:05 »
http://www.theserverside.com/news/thread.tss?thread_id=26479

Eigentlich gibt es irgendwie alles schon :)
Ich habe das gefunden.

Damit sollte sich das Problem erledigt haben ich muß zwar noch ein wenig damit testen, aber es sieht gut aus.

Ich danke euch für die Hilfe.


Gruss Thorsten

Offline thorsten_w

  • Junior Mitglied
  • **
  • Beiträge: 60
  • Geschlecht: Männlich
Re: Eigenständiger Java Thread
« Antwort #13 am: 15.12.05 - 17:29:52 »
Upps, nach nochmaligem lesen des Threads.....

Entschuldige Axel, das hattest du schon erwähnt. Hatte ich wohl überlesen.

Zitat
Gibt ja auch unterschiedliche Connection Pool Lösungen. U.a. auch eine in Jakarta Commons. Vielleicht hilft das. 
Wofür brauchst du das?

Die Commons funktionieren wunderbar.

Kann man den Thread irgendwie als abgeschlossen markieren?
Danke für eure Hilfe nochmal. Ich werde hier mal etwas öfter reingucken. vielleicht kann ich auch jemanden helfen.


Gruss Thorsten

Offline koehlerbv

  • Moderatoren
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Eigenständiger Java Thread
« Antwort #14 am: 15.12.05 - 17:37:46 »
Ich werde hier mal etwas öfter reingucken. vielleicht kann ich auch jemanden helfen.

Hallo Thorsten,

das würde uns sehr freuen - dieses Forum lebt von substantiellen Beiträgen.

Wegen des Erledigt-Symbols schaust Du die Forums-Regeln Punkt 3.6 (hier die betreffende Stelle):
Zitat
Diese "Erledigt"-Schaltfläche ist momentan aufgrund eines Software-Updates nicht verfügbar, wird aber demnächst wieder eingebaut. Als Workaround kann der Erstbeitrag editiert und das Symbol "Daumen hoch" ausgewählt werden.

Bis bald,
Bernhard

Offline thorsten_w

  • Junior Mitglied
  • **
  • Beiträge: 60
  • Geschlecht: Männlich
Re: Eigenständiger Java Thread
« Antwort #15 am: 15.12.05 - 18:09:27 »
Danke dir

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Eigenständiger Java Thread
« Antwort #16 am: 15.12.05 - 20:22:28 »
Ich werde hier mal etwas öfter reingucken. vielleicht kann ich auch jemanden helfen.
auf jeden Fall. Erst mit diesen kleinlichen Nümmerschen (Java.1.1, 2, 1.3, whatever) durcheinanderzukommen und dann in Stunden oder Minuten Commons-DBCP in eine komplexere Anwendung einzubinden hat definitiv Stil.  ;)
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline thorsten_w

  • Junior Mitglied
  • **
  • Beiträge: 60
  • Geschlecht: Männlich
Re: Eigenständiger Java Thread
« Antwort #17 am: 16.12.05 - 14:56:20 »
Ich werde hier mal etwas öfter reingucken. vielleicht kann ich auch jemanden helfen.
auf jeden Fall. Erst mit diesen kleinlichen Nümmerschen (Java.1.1, 2, 1.3, whatever) durcheinanderzukommen und dann in Stunden oder Minuten Commons-DBCP in eine komplexere Anwendung einzubinden hat definitiv Stil.  ;)

Passiert mir öfter, das ich vor der 2ten Kanne Kaffee noch nicht richtig lesen kann  ;D

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz