World Map
Java Service Wrapper ist der einfachste Weg, um Ihr Produkt zuverlässiger, sicherer zu machen.
  • Free Trial
  • Buy Now
WrapperSimpleApp Integration (Linux / UNIX)

Methode 1 - WrapperSimpleApp Integration (Linux / UNIX)

Übersicht

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 d:\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:

{WRAPPER_HOME}/bin/wrapper
{WRAPPER_HOME}/src/bin/App.sh.in

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:

{WRAPPER_HOME}/lib/libwrapper.so
{WRAPPER_HOME}/lib/wrapper.jar

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:

{MYAPP_HOME}/lang/wrapper_XX.mo
{MYAPP_HOME}/lang/wrapperjni_XX.mo

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:

java -classpath "d:\helloworld\lib\myjar.jar" -Xms128M -Xmx512M com.tanukisoftware.HelloWorld arg1 arg2
                        

Ändern der wrapper.conf Datei

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:

set.MYAPP_HOME=/usr/lib/helloworld
set.JAVA_HOME=/usr/lib/jvm/java-8-openjdk

Java Executable

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.

wrapper.java.additional.1=-Xms128M
wrapper.java.additional.2=-Xmx512M

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:

wrapper.java.classpath.1=%MYAPP_HOME%/lib/wrapper.jar
wrapper.java.classpath.2=%MYAPP_HOME%/bin/myjar.jar

Main Class

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).

wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp

Anwendungsparameter

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.

wrapper.app.parameter.1=com.tanukisoftware.HelloWorld
wrapper.app.parameter.2=arg1
wrapper.app.parameter.3=arg2

Library-Verzeichnis

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-Datei libwrapper.so muss im Library-Pfad, der gegenüber der JVM angegeben wird, bestimmt werden.

Der Library-Pfad wird unter Nutzung der wrapper.java.library.path.<n> Eigenschaften gesetzt.

wrapper.java.library.path.1=%MYAPP_HOME%/lib

Zusammenfassung

Als Zusammenfassung bekommen wir Folgendes:

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.

Beispiel: (Wartezeit aktivieren)
wrapper.java.additional.10=-Dorg.tanukisoftware.wrapper.WrapperSimpleApp.waitForStartMain=TRUE

maxStartMainWait System Eigenschaft:

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:

Der Standardwert ist "2 Sekunden".

Beispiel: (300 Sekunden)
wrapper.java.additional.10=-Dorg.tanukisoftware.wrapper.WrapperSimpleApp.maxStartMainWait=300

NOTE

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 up to date 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.