Die Methode 1 wird eingesetzt, um die WrapperSimpleApp Helper-Class für den Anwendungsstart zu benutzen.
Dies ist bei weitem der einfachste Weg, um den Wrapper zu integrieren, und da wo möglich, wird dieser auch sehr empfohlen.
Es gibt jedoch ein paar Dinge, auf die man achten sollte, wenn man diese Methode benutzt. Wenn der Wrapper die JVM beendet, gibt es keinen direkten Aufruf in der Anwendung, die ein sauberes Beenden ermöglicht. Viel mehr beendet der Wrapper die JVM durch das Aufrufen von System.exit() innerhalb der JVM. Falls die Anwendung ihren eigenen "Shutdown Hook" registriert hat, wird dieser aufgerufen werden, und gibt so der Anwendung eine Möglichkeit, sich ordnungsgemäß zu beenden. Wenn andererseits kein Shutdown Hook registriert ist, dann wird die Anwendung plötzlich beendet gleich dem Drücken von CTRL-C in der Konsole (Kommandofenster). Beide Fälle, mit und ohne ein Shutdown-Hook, liefern das genau gleiche Verhalten, als ob die Anwendung ohne den Wrapper laufen würde.
Durch dieses Einbinden der Methode 1 die
WrapperSimpleApp Helper-Class ersetzt die Main-Class einer Anwendung.
Dies gibt der WrapperSimpleApp Klasse eine Chance,
den WrapperManager sofort zu initialisieren und die JVM mit dem Wrapper zu registrieren.
Die WrapperSimpleApp Klasse regelt dann den gesamten Austausch mit dem Wrapper sowohl den Lebenszyklus einer Anwendung.
Wenn der Wrapper eine Start-Nachricht an die JVM via den WrapperManager sendet,
wird die Hauptmethode der aktuellen Main-Class der Anwendung aufgerufen.
Die WrapperSimpleApp Helper-Class wird darüber informiert, wie die Anwendung durch Übergabe des Main-Class-Namens,
gefolgt durch beliebige zusätzliche Anwendungsparameter an die Main-Methode der WrapperSimpleAppzu starten ist.
Detaillierte Anweisungen
Dieser Abschnitt erlaubt Ihnen, eine detaillierte Beschreibung durchzugehen, wie eine einfache HelloWorld-Anwendung
zu konfigurieren ist, um diese innerhalb des Wrappers auszuführen.
Die meisten anderen Anwendungen können durch das Ausführen der gleichen Schritte eingebunden werden.
Installation HelloWorld-Anwendung
Dieses Tutorial startet mit einer einfachen Anwendung HelloWorld, die einfach nur "Hello world" ausgibt.
Der Pfad zu dieser Anwendung ist /usr/lib/helloworld - und hat den Referenznamen {MYAPP_HOME}.
Ein paar zusätzliche Ordner (bin, lib, conf und logs), in denen Dateien des Wrappers kopiert werden, müssen existieren.
Installation der Wrapper-Dateien
Es gibt vier Verzeichnisse, die eine Konfiguration erfordern, um den Wrapper nutzen zu können.
NOTE
Bitte stellen Sie sicher, dass Sie die passenden Wrapper und libwrapper.so -Dateien benutzen,
die für die auszuführende Plattform erstellt wurden.
Es mag offensichtlich erscheinen, aber die Linux-Version des Wrappers wird zum Beispiel auf Solaris nicht funktionieren.
bin-Verzeichnis
Der Wrapper wird mit einem Shell-Skript ausgeliefert,(sh)
welches genutzt werden kann, um zuverlässig jede Java-Anwendung starten und beenden zu können, die
vom Java Service Wrapper gesteuert wird.
Als erstes kopieren Sie bitte die folgenden Dateien in das HelloWorld bin Verzeichnis:
Benennen Sie die Skript-Datei um, so dass sie ihren Anwendungsnamen wiedergibt.
{MYAPP_HOME}/bin/helloworld
Öffnen Sie nun das Skript in einem Editorprogramm.
Wir müssen lange und kurze Namen festlegen,um richtig widerzugeben, dass das Skript genutzt wird, um HelloWorld zu starten.
Sie werden die zwei Variablen sofort hinter dem Skriptheader sehen
APP_NAME und APP_LONG_NAME.
Vorgeschlagene Werte für diese Variablen werden unten angezeigt.
APP_NAME="helloworld"
APP_LONG_NAME="Hello World"
Das Skript sollte keine zusätzliche Abänderung erfordern.
Jedoch geht es davon aus, dass die wrapper.conf Datei
sich innerhalb eines conf -Verzeichnis (one level up,
../conf/wrapper.conf)befindet.
Wenn Sie wünschen, die wrapper.conf Datei woanders abzulegen, ist es erforderlich, dass die
WRAPPER_CONF -Variable im Skript entsprechend angepasst wird.
NOTE
Wichtig! Bevor Sie fortfahren, stellen Sie bitte sicher, dass für alle Dateien, die in das
bin Verzeichnis kopiert wurden, das ausführbare Bit gesetzt wurde.
lib-Verzeichnis
Kopieren Sie die Native-Library und die Wrapper jar-Datei ins HelloWorld lib -Verzeichnis:
Die libwrapper.so Datei ist eine
Native-Library-Datei,
die von dem Teil des Wrappers benötigt wird, der innerhalb der JVM läuft.
Die wrapper.jar Datei beinhaltet alle Wrapper-Klassen.
NOTE
Beachten Sie bitte, dass die Native-Library
auf ein paar Plattformen geringfügig unterschiedliche Namensgebungsregeln folgt. Mögliche Namen beinhalten;
libwrapper.a,
libwrapper.sl,
libwrapper.so,
und libwrapper.jnilib.
In jedem Fall sollte die Datei kopiert werden, ohne dass die Dateiendung sih ändert.
conf-Verzeichnis
Sämtliche Konfigurationseinstellungen des Wrappers erfolgen über die Datei
wrapper.conf.
Der Standard-Ablageort für diese Datei befindet sich in einem conf-Verzeichnis
in dem Homeverzeichnis der Anwendung.
Bitte kopieren Sie die folgende Vorlagendatei wrapper.conf.in
in das conf-Verzeichnis von HelloWorld.
{WRAPPER_HOME}/src/conf/wrapper.conf.in
Stellen Sie dabei sicher die Endung .in
zu entfernen, so dass die Datei wrapper.conf lautet.
Sie sollten nun Folgendes haben:
{MYAPP_HOME}/conf/wrapper.conf
Wenn Sie wünschen, die Konfigurationsdatei wrapper.confin ein anderes Verzeichnis zu verschieben,
können Sie es so tun.
Sie müssen die Skript-Dateien, die in das oben genannte bin-Verzeichnis kopiert wurden,
ändern, damit der neue Ort richtig widergegeben wird.
logs-Verzeichnis
Die Standard-Konfigurationsdatei wrapper.conf legt eine
wrapper.log Datei in ein logs-Verzeichnis
unterhalb des Homeverzeichnisses der Anwendung ab.
Stellen Sie sicher, dass Sie folgendes Verzeichnis erstellt haben:
{MYAPP_HOME}/logs
Wenn Sie wünschen, die wrapper.log Datei in einem anderen Verzeichnis abzulegen,
müssen Sie die wrapper.conf Datei editieren und die Wrapper-Logdatei
wrapper.logfile Eigenschaften anpassen, um den neuen Ort passend wiederzugeben.
lang-Verzeichnis
Von der Wrapper Version 3.5.0, kann der Wrapper
örtlich festgelegt werden.
Die Sprachen-Ressourcedateien können im lang-Verzeichnis gefunden werden.
Falls notwendig, erstellen Sie bitte so ein lang Verzeichnis unterhalb
des Home-Verzeichnisses der Anwendung und kopieren Sie diese Dateien dorthin:
Wenn Sie wünschen die *.mo Dateien an einem anderen Ort abzulegen, müssen Sie die
wrapper.conf-Datei editieren und die Eigenschaften des
wrapper.lang.folder abändern, um den neuen Ort richtig wiederzugeben.
Gehen Sie in die Java-Befehlszeile der Anwendung
Bevor der Wrapper konfiguriert werden kann, eine Anwendung zu starten, müssen Sie den kompletten
Java-Befehl kennen, der normalerweise benutzt wird.
Die Mehrheit des Skripts hat die Aufgabe systemspezifische Informationen zu sammeln, diese Information
in den Umgebungsvariablen zu speichern und dann abschliessend den Java-Befehl auszuführen.
Um den Wrapper zu konfigurieren, ist alles, was wirklich benötigt wird, die Java-Befehlszeile.
Im Fall unserer einfachen HelloWorld-Anwendung wird ein Skript nicht benötigt. Der zu ausführende Befehl würde wie folgt aussehen:
java com.tanukisoftware.HelloWorld
Ein komplexerer Befehl, um eine Java-Anwendung zu starten, würde wie folgt aussehen:
Um die obengenannte Java-Befehlszeile mit dem Wrapper nutzen zu können,
müssen wir die Komponenten der Befehlszeile in eine Konfigurationsdatei aufteilen.
Öffnen Sie hierfür die wrapper.conf
Datei in einem Editor und führen Sie die unten genannten Änderungen durch.
NOTE
Wo die Eigenschaften unten erwähnt sind, werden Links zu den Beschreibungen genannt.
Nehmen Sie sich bitte die Zeit, die Beschreibungen von allen Eigenschaften,
die verändert wurden, zu überprüfen.
In vielen Fällen gibt es weitere Beschreibungen bezüglich ihrem Einsatz, die hier nicht aufgeführt werden.
Umgebungsvariable:
Für eine einfache Konfiguration wird empfohlen das HOME-Verzeichnis
von HelloWorld und Java in die Umgebungsvariablen der Konfigurationsdatei zu speichern.
Dies ermöglicht, die conf-Datei einfacher zu lesen und zu warten im Fall, dass ein Verzeichnis geändert wurde.
Der Wrapper setzt diese Umgebungsvariablen jedes Mal, wenn er gestartet wird:
Zuerst wird die Java-Programmdatei extrahiert und der Verzeichnispfad der
wrapper.java.command Eigenschaft zugewiesen:
wrapper.java.command=%JAVA_HOME%/bin/java
Java-Argumente
Die meisten Anwendungen liefern eine Zahl von Parametern an die Java-Programmdatei, sobald sie gestartet wird, übergeben werden.
Der Wrapper liefert besondere Eigenschaften für die Konfiguration von Dingen wie Speicher oder auch Klassen- und Verzeichnis-Pfade.
Diese werden weiter unten behandelt. Jedoch werden alle anderen Einstellungen durch den Einsatz der
wrapper.java.additional.<n> Folge an Eigenschaften konfiguriert.
Die HelloWorld-Anwendung übernimmt 2 zusätzliche Java-Argumente.
Die ursprüngliche und maximale Speichergröße der JVM, die durch -Xms128m (ursprünglich) und
-Xmx512m (maximal) bestimmt wird,
kann unter Einsatz der wrapper.java.initmemory
und wrapper.java.maxmemory Eigenschaften definiert werden.
# Initial Java Heap Size (in MB)
wrapper.java.initmemory=128
# Maximum Java Heap Size (in MB)
wrapper.java.maxmemory=512
Classpath
Als Nächstes kommt der Classpath, der unter Einsatz der
wrapper.java.classpath.<n> Eigenschaften konfiguriert wurde.
Der Wrapper erfordert, dass der Classpath in seine individuellen Teile aufgeteilt wird.
Dann, auch weil wir den Wrapper benutzen, ist es notwendig, auch
die wrapper.jar Datei mit einzuschließen:Als Nächstes kommt der Classpath, der unter Einsatz der
wrapper.java.classpath.<n> Eigenschaften konfiguriert wurde.
Der Wrapper erfordert, dass der Classpath in seine Einzelteile aufgeteilt wird.
Dann, auch weil wir den Wrapper benutzen, ist es notwendig, auch
die wrapper.jar Datei mit einzuschließen:
Um eine Kommunikation zwischen HelloWorld und den Wrapper zu erstellen,
ist der Einsatz der Helper-Class WrapperSimpleApp
als Main-Class notwendig.
Die Main-Class, die von Java beim Start ausgeführt wird, wird definiert unter Nutzung der
wrapper.java.mainclass Eigenschaft.
Die HelloWorld Main-Class wird dann als der erste Anwendungsparamter bestimmt (Sehen Sie bitte den Abschnitt unten).
Anwendungsparameter werden unter Benutzung der
wrapper.app.parameter.<n> Eigenschaften gesetzt.
Anwendungsparameter erscheinen in der Java-Befehlszeile direkt hinter der Main-Class.
Wie oben erwähnt, ist es notwendig als ersten Parameter die HelloWorld Main-Class festzulegen. Andere Parameter kommen danach.
Um den Wrapper einzusetzen, gibt es eine weitere Eigenschaft, die gesetzt werden muss.
Der Wrapper benutzt eine Native-Library um den Austausch mit dem System zu steuern.
Diese Library-Dateilibwrapper.so
muss im Library-Pfad, der gegenüber der JVM angegeben wird, bestimmt werden.
set.MYAPP_HOME=/usr/lib/helloworld
set.JAVA_HOME=/usr/lib/jvm/java-8-openjdk
wrapper.java.command=%JAVA_HOME%/bin/java
# Java Main class.
wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp
# Java Classpath (include wrapper.jar)
wrapper.java.classpath.1=%MYAPP_HOME%/lib/wrapper.jar
wrapper.java.classpath.2=%MYAPP_HOME%/bin/myjar.jar
# Java Library Path (location of Wrapper.DLL or libwrapper.so)
wrapper.java.library.path.1=%MYAPP_HOME%/lib
# Java Bits. On applicable platforms, tells the JVM to run in 32 or 64-bit mode.
wrapper.java.additional.auto_bits=TRUE
# JVM settings
wrapper.java.additional.1=-Xms128M
wrapper.java.additional.2=-Xmx512M
# Initial Java Heap Size (in MB)
#wrapper.java.initmemory=128
# Maximum Java Heap Size (in MB)
#wrapper.java.maxmemory=512
# Application parameters. Add parameters as needed starting from 1
wrapper.app.parameter.1=com.tanukisoftware.HelloWorld
wrapper.app.parameter.2=arg1
wrapper.app.parameter.3=arg2
Testen
HelloWorld kann nun durch einfaches Ausführen der Skript-Datei bin/helloworld console gestartet werden.
Aufgrund der Art, wie der Wrapper sein aktuelles Verzeichnis festlegt, ist es nicht notwendig,
diese Skript-Datei innerhalb des bin Verzeichnis auszuführen.
Wie Sie sehen werden, wenn Sie einen Befehl auslassen, entsprechen die Skripts, die mit dem Wrapper geliefert werden,
ziemlich Standard Daemon-Skripts.
Sie akzeptieren console, start, stop,
restart, und dump Befehle.
Die start, stop, und restart Befehle
sind den meisten Daemon-Skripten geläufig und werden benutzt, um den Wrapper und seine Anwendung als ein Daemon-Prozess zu steuern.
Der status Befehl kann genutzt werden, um herauszufinden, ob der Wrapper gegenwärtig läuft oder nicht.
Der console Befehl startet den Wrapper in der aktuellen Shell, macht es möglich,
dass die Anwendung mit CTRL-C beendet werden kann.
Der abschliessende Befehl, dump, sendet ein kill -3
Signal zum Wrapper, welche seine JVM veranlasst, einen vollständigen Thread-Dump zu erstellen.
Glückwünsch. Ihre Anwendung sollte jetzt laufen.
Wenn Sie irgendwelche Probleme haben würden, sehen Sie bitte im Abschnitt Troubleshooting
nach, um Hilfe für das Aufspüren des Problems zu erhalten.
Erweiterte Informationen
Tuning des Hochstartens
Standardmässig wartet die
WrapperSimpleApp
Klasse 2 Sekunden auf die Main-Methode der User-Anwendung für die Fertigstellung.
Danach nimmt sie an, dass die Anwendung gestartet wurde und erstattet einen Bericht an den Wrapper-Prozess.
Dies wird gemacht, weil viele User-Anwendungen mit Main-Methoden geschrieben sind,
die keinen Wert während der Ausführung der Anwendung zurückgeben.
In solchen Fällen gibt es keinen sicheren Weg für die WrapperSimpleApp-Klasse mitzuteilen,
wann und ob die Anwendung das Hochstarten fertiggestellt hat.
Wenn es jedoch bekannt ist, dass die Main-Methode der Anwendung einen Wert zurückgibt,
sobald die Anwendung gestartet wurde, würde es für den Wrapper am besten sein, zu warten bis dies getan ist,
bevor es mit der Ausführung fortsetzt.
waitForStartMain System Eigenschaft:
Für Main-Methoden, die auf diese Art Werte zurückgeben, die WrapperSimpleApp sucht nach der
org.tanukisoftware.wrapper.WrapperSimpleApp.waitForStartMain
System Eigenschaft.
Wenn es auf TRUE eingestellt ist, wird die WrapperSimpleApp
unbegrenzt auf die Main-Methode für die Fertigstellung warten.
Unendlich zu warten ist eine vorteilhafte Option, wenn es gewiss ist, dass die Main-Methode zeitnah antworten wird.
Aber andererseits, während es unbegrenzt wartet, wird der Wrapper niemals während des Hochfahrens aufgeben, unabhängig davon, wie lange es dauert.
Daher ist es dann, wenn die Möglichkeit gegeben ist, dass dieser Hochstarten-Vorgang hängen könnte, besser, die
org.tanukisoftware.wrapper.WrapperSimpleApp.maxStartMainWait
Systemeigenschaft auf die maximale Wartezeit einzustellen.
Zum Beispiel um bis zu 5 Minuten (300 Sekunden) für die Fertigstellung der Main-Methode beim Hochstarten zu warten,
stellen Sie die Eigenschaft auf 300, wie folgt ein:
Die Hauptmethoden von vielen Anwendungen sind ausgelegt, keinen Ergebniswert zu geben.
In diesen Fällen müssen Sie sich entweder an die üblichen 2-Sekunden-Timeoutzeit beim Hochstarten
halten oder ein etwas längeres Timeout bestimmen.
Dies ist unter Nutzung der maxStartMainWait-Eigenschaft möglich,
um die Zeitspanne zu simulieren, die Ihre Anwendung braucht, um hochzustarten.
WARNING
?
Please check the English version for a more recent version of this text.
Wenn der Wert TRUE in der waitForStartMain für eine Anwendung festgelegt ist dessen
start Methode niemals einen Wert zurückgibt, erscheint der Wrapper zu Anfangs korrekt zu funktionieren.
Jedoch befindet sich der Wrapper in Wirklichkeit in einem ewig andauernden Wartestatus und wird nie in einen StartModus kommen.
Das bedeutet, dass der Windows Service Manager und weitere der Wrapper-Fehlermechanismen nicht korrekt funktionieren werden.