Das Notes Forum
Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: Thomator am 14.02.05 - 11:20:58
-
Hallöchen,
hat schon mal jemand mit JavaServerAddins gearbeitet und kann zum Deployment was sagen?
Dazu scheint es leider keine Dokumentation zu geben und was man so im Internet findet ist zwar für die Programmierung sicher ausreichend, aber wie, in welcher Form und wo muß ich das Ganze denn unterbringen, damit der Domino das Addin findet?
Thomas
-
was meinst du damit ungefähr?
Manfred Dillmann hatte letztens auch so etwas. Bezog sich u.a. auf einen Blogeintrag von Julian Robinchaux. Es scheint darum zu gehen, dass man Server-Addins, die man früher als dll geschrieben hat, nun als Java geschrieben werden können. Der Vorteil erschliesst sich mir nicht so ganz. Ich hätte Angst von Memory Leaks ähnlich wie in LS2J (verursacht von Lotus, nicht SUN).
Java gewinnt für den Anwendungsentwickler viel durch vorhandene, standasisierte Infrastrukturen wie etwa J2EE sowie der darauf aufbauenden Frameworks, Literatur, Experten, Internet-Schwätzer, uvam. Lotus hat dann für ihr Domino eigene Sachen mit Java gemacht. Besonders überzeugend finde ich es nicht. Sie selbst offenbar auch nicht, sonst hätten sie sich für Notes 8 aka. Workplace nicht endlich dem gemeinsamen J2EE Standard unterworfen.
Zum Java lernen halte ich Domino wie es zur Zeit ist für eine gänzlich ungeeignete Platform, da man auf zahlreiche low level concerns wie etwa Speichermanagement ohne Garbage-Collector achtgeben muss und es weitere gerade für Anfänger schwer zu durchschauende gotchas gibt (spezielles Class-Loading, Java Securtiy und Notes Security können sich ins Gehege kommen ...> z.B. bei JDBC, eigener uralt xml-Parser bis einschliesslich in R6.5, etc..)
-
Hallo Marinero,
ich sitze immer noch an dem Problem mit den Corba-Sessions aus den Agenten. Da ich auch von notes.net bisher noch keine Antwort habe, suche ich halt nach alternativen Lösungen.
Meine momentan einzige Idee, diesen Zugriff hinzubekommen, ist so ein Server-Addin. Das Teil soll ein ServerSocket zur Verfügung stellen, auf den über den Port der Agent zugreifen kann. Ich denke, aus dieser Umgebung könnte es funktionieren.
Das ist nicht irgendwie der Versuch, Java zu lernen, sondern der echte Versuch, ein Problem zu lösen. Mit Java bin ich schon ein Weilchen zu Gange, was natürlich nicht heißt, dass ich mich da nicht weiterentwickeln könnte ;).
Meine Frage bezog sich auf die Platzierung eines solche ServerAddin's. Also muß es ein .jar-file sein, in welchem Ordner muß es liegen, damit ich es von der Console starten kann, etc.
Leider kann ich dazu nicht wirklich was finden.
Thomas
-
Ok. Nimms nicht persönlich. Der Gedanke schwirrt in meinem Kopf herum.
Frag Manfred Dillmann.
Ich glaub der hat das ans Laufen bekommen.
Hier ist die Webseite: http://www.madicon.de/component/option,com_frontpage/Itemid,1/
-
Sooo persönlich hab ich's ja auch nicht genommen 8).
Besten Dank jedenfalls. Ich werde dort mal schauen, ob ich was finde.
Thomas
-
Hallo Thomas, hallo Axel,
>>Ich werde dort mal schauen, ob ich was finde.<<
Brauchst Dir die Mühe nicht zu machen, da findest Du (noch) nix...
Thomas, zu Deiner Frage:
Da ich (kannst Du im Java-Bereich lesen) bei Java noch am Anfang stehe, kann ich nur schreiben, was ich gemacht habe. Es funktioniert, aber ich finde auch keine Doku dazu.
Ich hatte das Beispiel zum Server-Addin von nsftools.com (.java) übersetzt und die .class-Datei einfach in Domino-Programmverzeichnis kopiert. Dann kann man das an der Domino-Konsole via
load runjava <name-of-classfile w/o extension>
starten. Mit
tell runjava quit oder
tell <name-of-classfile w/o extension> quit
kannst Du das Addin beenden.
Thomas, Du schreibst:
>>Das Teil soll ein ServerSocket zur Verfügung stellen, auf den über den Port der Agent zugreifen kann.<<
Genau sowas benötige ich auch für meinen SMTP Listener. Wenn Du (kannst ja offensichtlich Java) ein Stück weiter bist, wäre ich ein paar Infos zu Deiner Realisierung dankbar. Wenn Du Dir das Beispiel von nsftools.com anschaust, wirst Du sehen, dass alle Aktivitäten des Addins in einer Schleife ablaufen. Ich habe keine Idee, wie ich innerhalb dieser Schleife einen Socket einmalig starte und dieser dann auf Requests "lauscht"...
Gruß
Manfred
P.S. Mit einer JAR-Datei habe ich es nicht probiert.
-
Hallo Manfred,
ich baue mal weiter an der Lösung und wenn ich das so weit am Laufen habe, meld ich mich noch mal.
Mit dem .jar-file das muss ich eben mal testen, wäre schon unschön, wenn 5327 .class-files im Programmverzeichnis vom Domino runfliegen.
habe keine Idee, wie ich innerhalb dieser Schleife einen Socket einmalig starte und dieser dann auf Requests "lauscht"...
Eigentlich muß das Socket nur vor der Schleife instantiiert werden und wenn die Schleife beendet wird, wieder Terminiert. Der Socket-Thread läuft dann unabhängig von der Schleife, die auf die Consolen-Kommandos lauscht.
Aber wie schon gesagt, wenn ich da was zustande bringe, poste ich noch mal.
Thomas
-
Hallo Thomas,
wenn Du eh schon dabei bist, hätte ich noch eine Frage:
In der "Main-Loop" ist im Beispiel folgender Code:
if (AddInDayHasElapsed())
{
AddInSetStatusLine(taskID, "Doing Daily Stuff");
consolePrint(progName + ": Another day has passed...");
AddInSetStatusLine(taskID, "Idle");
}
else if (AddInMinutesHaveElapsed(3))
{
AddInSetStatusLine(taskID, "Doing 10-Minute Stuff");
consolePrint(progName + ": 3 more minutes have gone by...");
AddInSetStatusLine(taskID, "Idle");
}
else if (AddInSecondsHaveElapsed(30))
{
AddInSetStatusLine(taskID, "Doing 30-Second Stuff");
consolePrint(progName + ": 30 seconds, and all is well...");
AddInSetStatusLine(taskID, "Idle");
}
Bis auf AddInDayHasElapsed() sind in der Notes.jar die Minutes- und Seconds-Varianten umbenannt worden. Nicht schön, aber nicht schlimm. Wenn ich mir in Eclipse im Class-Browser? (also da, wo man sich alles in der Notes.jar anschauen kann) die Minutes- und Seconds-Varianten anschaue und diese verwende, sagt Eclispe, die seinen "deprecated". Sie funktionieren noch, man sollte sowas also nicht mehr verwenden, oder?
Ich brauche aber für meinen pop-to-smtp Teil eine Zeitsteuerung für das Abrufen der POP-Konten. Wie macht man das, wenn man die in der Notes.jar enthaltenen Routinen nicht mehr verwenden soll?
Danke für Deine Antwort.
Manfred
-
Hi Manfred,
normalerweise werden Methoden, die auf 'depracated' gesetzt werden, von anderen abgelöst (aber eben nur normalerweise).
Ich habe selber noch nicht nachgesehen, aber ich könnte mir vorstellen, dass diese Abfragen richtig gut Overhead erzeugen, weil in jedem Durchlauf der Schleife alle Prüfungen vorgenommen werden.
Vielleicht ist das Ganze auch deswegen depraceted gesetzt worden.
Wenn Du immer die gleichen Intervalle zur Abfrage brauchst würde ich empfehlen, diese Methoden ganz außen vor zu lassen, und in das SMTP-Handling in einen extra Thread auszulagern (initialisierung auch vor dem Main-Loop).
Dort dann ein Thread.sleep(Intervall in ms) einbauen. Dann stoppt der ganze Thread für die Zeit und läuft danach einfach wieder einmal durch.
So können in der Main-Schleife die Consolen-Kommandos abgefangen werden und Dein SMTP-Handling ist davon quasi unabhängig.
Allerdings must Du diesen Thread dann beim Terminieren des Addin's auch noch stoppen.
Thomas
-
Hi,
das ist alles sehr interessant.
Bisher wußte ich überhaupt nicht das es die Möglichkeit gibt mit Java addins zu schreiben.
Weiß jemand von euch ob ich damit auch lokale addins für den Client schreiben kann ?
Danke
Gruß
Qojote
-
Hi qojote,
also das ist dann sicher kein ServerAddin, aber grundsätzlich geht das sicher schon. Allerdings würde ich das dann eher als einen lokalen Server bezeichnen ;D.
Aber wenn Du einen Java-Server (selbstprogrammiert) lokal am laufen hast, können andere Anwendungen (wie auch Notes) damit über den Port sicher kommunizieren.
Allerdings must Du dat Dingen dann eben lokal in einer eigenen VM (JRE) am Laufen haben, was bei dem ServerAddin der Domino für Dich managen würde.
Thomas
-
Hallo Thomas,
danke für die Infos. Ich versuche in diese Richtung zu gehen, bei mir geht es allerdings noch im Schneckentempo voran - ich muss im Moment noch zu viele Details nachlesen.
Egal. Wenn Du neue Erkenntnisse hast - immer her damit... :)
Gruß
Manfred
-
Hi,
danke für deine Antwort.
Eigener Server :P wäre schön davon bin ich aber noch Meilen entfernt.
Nein ich dachte über ein Addin für den Notes Client nach dort hast du ja auch die Möglichkeit Dlls einzubinden als Addin Task.
Würde das dort mit auch mit Java gehen wäre das doch eine ganz gute Alternative.
Gruß
qojote
-
Hallo Qojote,
>>Weiß jemand von euch ob ich damit auch lokale addins für den Client schreiben kann ?<<
Ich kann mir selbst nicht vorstellen, dass es in diesem konkreten Fall geht, Du kannst aber versuchen, die nrunjava.exe des Domino-Servers in Dein Notes Programmverzeichnis zu kopieren und dann von einem DOS-Fenster aus zu starten.
Zumindest für COMPACT, FIXUP usw. funktioniert das.
Gruß
Manfred
-
weiss nicht, ob ich das von Thomas jetzt richtig verstanden habe, aber ich würde auf jeden Fall die SMTP, POP3 Connections zwischen den Aufrufen schliessen und neu erzeugen.
Kann man nicht auf die "Main Loop" selbst Thread.pause(miliSeconds) aufrufen?
Dann bräuchtest du keinen neuen Thread.
-
@Qojote
Das ist mit einem Java-Addin glaub ich nicht ganz so einfach, weil das eben nur in einer eigenen VM läuft und nicht so einfach Methoden zur Verfügung stellen kann. Wenn so eine Anwendung in der VM lokal läuft kann man auch über RMI Methoden nutzen.
Allerdings macht das die Sache nicht unbedingt einfacher und performanter.
Ansonsten ist so ein Mini-Server, der ein paar Dienste zur Verfügung stellt, gar nicht so kompliziert.
Nur mal so als Stichworte zum Nachlesen:
Socket und ClientSocket
Da muss man aber auch noch irgendwie absichern, dass sich an diesem Port niemand aus dem Netz bedient, der das gar nicht soll.
Thomas
-
@Axel
da gehe ich mit: Die Connections sollte man schon schließen.
Mit dem Thread.sleep in der Main-Schleife das war auch mein erster Gedanke, allerdings hast Du doch dann ein Problem mit dem Abfangen der Consolenkommandos. Ich denke mal, das wäre nicht so prickelnd, wenn man den Task an der Konsole quittiert und 20 min. später wird der auch beendet ;).
Thomas
-
@ All
Danke werd ich mir mal anschauen hört sich interessant an.
Gruß
Qojote
-
Manfred:
Ich würd vom generellen Vorgehen erst einmal 2 standalone Anwendungen erstellen (einfach Kommandozeile, dh mit main-Methode aus Eclipse starten ...unabhängig von JavaServerAddin, etc.).
Dann mit der JavaMailApi versuchen per Pop3 oder IMAP Mails vom Remote Server zu holen und in eine NotesMailDB packen (2. Aufgabe).
Outbound Mails(?) in der Mail.Box(?) per SMTP an den externen Mailserver schicken.
Sobald das einigermassen läuft, kannst du dir Gedanken machen, wie du das in die JavaServerAddin-Umgebung einbindest.
Ich sehe beide Aufgaben als ein bischen unabhängig voneinander an. Und ein Vorteil von Java gegenüber Notes (und EJB) ist, dass man erst einmal getrennt von einem komplexen Produkt entwickeln kann und das später einbinden.
Axel
-
Hallo Axel,
danke für Deine Anregungen.
Ich habe z.Z. mit dem "Projekt" Probleme:
- Nach dem Export des Server-Addins in eine JAR (aus Eclipse) kann man dieses nicht mehr via LOAD RUNJAVA starten.
- Ich habe gesehen, dass mit der Beta3 von Domino7 nicht mehr die JARs POP3.JAR und SMTP.JAR installiert werden. Nur noch MAIL.JAR ist vorhanden. Ich weiss nicht ob das an der Beta liegt, aber wenn dem in der Final so wäre, kann ich den POP2SMTP Teil nicht mehr ralisieren. Oder sind die bei 6.5 noch verfügbaren JARs alle in der MAIL.JAR enthalten?
- Ich verstehe die Beispiele (nsftools.com und ein weiteres für Listener) nicht richtig. Das mag Dir lächerlich erscheinen, aber mir fehlt offensichtlich noch viel zu viel Java-Background. In Eclispe debuggen geht nicht, da Server-Addin.
- Losgelöst von Domino geht das Debuggen in Eclispe auch nicht, wenn ServerSockets o.ä. gestartet werden. Ich sehe dann in der Eclipse-Console nur (durch sout's), dass da was läuft und funktioniert - ich kann aber nicht mal erkennen, wie wo wer was warum wann aufruft - komme also kein Stück mehr weiter.
- Ich muss andauernd "jeden Pubs" nachlesen und finde in den eBooks z.T. nicht die richtigen Stellen, da ich im falschen Kontext suche. Das Nachlesen hilft zwar, aber es ist viel Holz und kostet Zeit.
- Ich habe zu wenig Zeit. Muß ja nebenbei noch meine Brötchen verdienen.
Fazit so weit:
Ich bekomme das im Moment nicht gebacken und muss noch viel mehr die Grundlagen von Java sicher beherschen, bevor ich sowas sinnvoll angehen kann. Also doch erst mal Hello World in allen Variationen.
Gruß
Manfred
-
Das ist wohl auch sinnvoll nur Schritt für Schritt möglich.
Wobei ich "Hello World in allen Variationen" ein bischen übertrieben finde.
Es ist viel einfacher, erst einmal mit den Standards oder auch den "advanced Standards" anzufangen.
Z.B. hat es Thomas Völkl (den ich nicht als Java Anfänger bezeichne) mit seinen Struts / ORM Projekten wesentlich einfacher als dein Projekt, weil es eben auf Standards aufbaut. Das ist gut dokumentiert, da gibt es hunderttausende von google Treffern zu.
Zumindest beherrschst du jetzt einigermassen Eclipse.
Vielleicht poste ich mal ein paar Ideen zu RDBMS Zugriffen, evtl. mit Mini Frontend auf Tomcat. Aber dazu bräuchte ich eben auch mehr Zeit.
Gruß Axel
-
Hallo Axel,
>>Wobei ich "Hello World in allen Variationen" ein bischen übertrieben finde.<<
Klar, hatte ich extra etwas provokant geschrieben. Ich habe aber jetzt deutlich gemerkt, das mein Vorhaben so nicht zu realisieren ist. Da ich keinen Druck habe (Java ist ja z.Z. mehr ein Hobby :) ), mache ich mich auch nicht verrückt.
Ich muss einfach grundsätzliche Zusammenhänge (Gestern Abend habe ich kapiert, was überladene Methoden in Klassen sind) besser verstehen. Mit diesem Wissen kann ich dann auch nicht-trivialen Beispiel-Code verstehen. So arbeite ich mich weiter durch. Trotz alledem sehr interessant, diese Java-Welt...
Gruß
Manfred
-
Und wieder eine nicht so schöne Nachricht:
In der JRE des Domino scheint es nicht möglich zu sein, eine Verbindung zu einem ServerSocket herzustellen.
Der Socket selbst läßt sich instantiieren, binden und alles was so nötig ist. Aber beim ersten Versuch eines Verbindungsaufbaus wird das allseits beliebte Fenster 'NSD is running' gezeigt. :'(
TOTALABSTURZ vom Domino.
Nachdem ich eine Weile rumprobiert habe bin ich zu dem Schluß gekommen, dass der Aufruf der Methode accept() zu diesem Absturz führt. Das dürfte nach meinem Verständnis von Java irgendwas natives sein oder RMI oder so. Damit hat der Domino vielleicht Probleme.
Allerdings wird trotz NSD der Server nicht richtig beendet. Da geht wirklich gar nix mehr und es hilft nur ein Neustart des Rechners.
Sch......ade eigentlich.
Ich werde die Problematik mit den Zugriffen auf 5'er Server jetzt im Servlet abfackeln. Da hätte ich auch schon früher draufkommen können. Das hätte mir eine Mange Arbeit und Tränen ;D erspart.
Thomas
-
Hallo Thomas,
danke für Deinen Erfahrungsbericht. So langsam könnte man an der Kombination Notes/Domino <-> Java die Freude verlieren...
Schade.
Gruß
Manfred
-
Hallo Manfred,
an sich ist die Kombination schon recht Potent, gerade im Zusammenspiel von Servlets in externen Servlet-Containern wie Tomcat und dem Domino.
Daß diese ServerAddin's so ihre Probleme mit sich bringen kann man meines Erachtens schon daraus ableiten, dass es von Seiten der IBM absolut nichts gibt, was überhaupt auf die Existenz dieser Möglichkeit hinweist. (hab ich zumindest nix finden können)
Allerdings habe ich inzwischen auch schon Lösungen gesehen, die auf diesem Wege implementiert worden sind, und astrein funktionieren (z.B. einen Importer für Daten aus einer RDB in Notes-DB's).
Also so ganz möchte ich das Thema noch nicht verteufeln, wenn ich mal wieder etwas Luft habe, werde ich in diesem Bereich mal noch ein bisschen rumspielen und schauen, was für Möglichkeiten dieses Feature bietet.
Also, nicht die Flinte in's Korn schmeißen, es macht auch Spaß, die Möglichkeiten solcher Schnittstellen auszuloten. Und der Frust ist immer eher vergessen ;D
Thomas
-
Hallo Thomas,
>>Also, nicht die Flinte in's Korn schmeißen, es macht auch Spaß, die Möglichkeiten solcher Schnittstellen auszuloten.<<
Flinte ins Korn werfen - mache ich bestimmt nicht. Wenn man in Java einsteigt und das schon komplex ist, macht es nur keinen rechten Spass, wenn man von der Domino-Seite noch andauernd irgendwelche Knüppel zwischen die Beine geworfen bekommt. Mir hatten letztes Jahr schon die Erfahrungen (im Zusammenhang mit meinem RSS Reader) mit der LS2J Schnittstelle gereicht.
Daher (das hatte Axel auch empfohlen) werde ich jetzt mein Vorhaben ohne Domino nur mit Java lösen. Mit der Java Mail-Api kann ich jetzt auf POP-Konten zugreifen und bekomme einzelne Mails "heruntergeladen". Im nächsten Schritt dann die Weitergabe via SMTP an den Domino-Server. Das bringt kleine Erfolgserlebnisse und so macht das Lernen auch etwas Spaß...
Gruß
Manfred
-
Daher (das hatte Axel auch empfohlen) werde ich jetzt mein Vorhaben ohne Domino nur mit Java lösen. Mit der Java Mail-Api kann ich jetzt auf POP-Konten zugreifen und bekomme einzelne Mails "heruntergeladen". Im nächsten Schritt dann die Weitergabe via SMTP an den Domino-Server. Das bringt kleine Erfolgserlebnisse und so macht das Lernen auch etwas Spaß...
Das ist auch eine gute Lösung.
Allerdings ist das auch wieder ein Punkt, der, wenn das Produkt an Kunden verkauft werden soll, eine zusätzliche und oft recht schwierige Argumentation nach sich zieht. In den meisten Fällen stehen Kunden, die in einer Notes-Umgebung arbeiten, solchen 'Stand-Alone'-Lösungen eher skeptisch gegenüber und müssen mit viel Kraft und Mühe von der Notwendigkeit überzeugt werden. Und das gelingt nicht immer.
Aber ich habe Dein Problem so verstanden, dass Du für eine interne Lösung entwickelst und dann entsteht dieses Problem ja nicht.
Thomas
-
Hallo Thomas,
Allerdings ist das auch wieder ein Punkt, der, wenn das Produkt an Kunden verkauft werden soll, eine zusätzliche und oft recht schwierige Argumentation nach sich zieht.
Stimmt. Habe ich mir auch schon Gedanken gemacht. Wäre ja doof, wenn man auf der Domino-Maschine noch zusätzlich eine JRE installieren muss, damit ein zusätzliches Tool läuft.
Besser ist sicher eine Lauffähigkeit mit Domino-Boardmitteln. Werde ich auch versuchen, sobald die gewünschte Funktionalität in Java core da ist. Dann weiss ich zumindest, dass es von der Java-Seite OK ist und unter Domino-Java laufen könnte. ;)
Aber ich habe Dein Problem so verstanden, dass Du für eine interne Lösung entwickelst und dann entsteht dieses Problem ja nicht.
Ich kann die Lösung tatsächlich intern gebrauchen. Ist so etwas der Motor, sowas überhaupt anzugehen. Da ich aber sebstständig bin, programmiere (oder lerne etwas aus dem IT Bereich) ich grundsätzlich nur mit dem Hintergrund einer späteren kommerziellen Nutzung. Von nix kommt ja nix...
Gruß
Manfred
-
<<dass es von der Java-Seite OK ist und unter Domino-Java laufen könnte.>>
Die Betonung liegt auf 'könnte' ;D
<<Von nix kommt ja nix...>>
Uneingeschränkte Zustimmung...