World Map
Java Service Wrapper ist der einfachste Weg, um Ihr Produkt verlässlicher zu machen.
  • Free Trial
  • Buy Now
TestWrapper Anwendung

Ausführen der TestWrapper Beispielanwendung

Dieser Abschnitt nutzt die TestWrapper Beispielanwendung, die mit dem Wrapper ausgeliefert wird, um einige der Fehlerwiederherstellungs-Features des Wrappers zu präsentieren.

Ausführen in einer Konsole

Nachdem Sie die Programmdatei des Wrappers installiert oder das Build der Quelldatei gestartet haben, werden Sie sofort die TestWrapper Anwendung starten können. Die TestWrapper Beispielanwendung wird auch genutzt, um viele der Recovery-Features des Java Service Wrappers zu testen.

Um das Beispiel auszuführen, gehen Sie in Ihr bin-Verzeichnis und starten das folgende Skript:

Windows:
TestWrapper.bat
Linux / Solaris:
./testwrapper start

NOTE

Das Solaris TestWrapper Skript versucht, eine PID-Datei ins /var/run Verzeichnis zu schreiben. Wenn Sie nicht als ein root User eingeloggt sind, wird dies fehlschlagen. Sie können dies einfach lösen, indem Sie einfach die PIDDIR-Variable im Skript ändern oder indem Sie sich als ein root User anmelden. Wenn Sie sich als ein root User anmelden, stellen Sie bitte sicher, dass Sie die passende Erlaubnis haben, um den X Server zu nutzen: andererseits wird es Ihnen nicht möglich sein, den TestWrapper zu sehen.

Die Windows-Konsole kann problemlos durch das Drücken von STRG-C beendet werden, aber die Linux und Solaris Version erfordern, dass Sie das Skript mit dem stop-Parameter ausführen:

Linux / Solaris:
./testwrapper stop

Die Linux und Solaris Versionen bieten die Möglichkeit an, Ihre Anwendung neu zu starten:

Linux / Solaris:
./testwrapper restart

Wenn die Anwendung startet, sollten Sie den folgenden Dialog sehen:

Sie sollten ebenfalls Folgendes in der Konsole sehen:

Konsolenausgabe:
wrapper  | --> Wrapper Started as Console
wrapper  | Launching a JVM...
jvm 1    | Initializing...
jvm 1    | Wrapper (Version 3.x.x)
jvm 1    |
jvm 1    | start()

Lassen Sie uns mit der Konsolenausgabe starten. Die erste Datenspalte zeigt die Ausgabenquelle an. Zeilen, die mit wrapper beginnen, stammen von der nativen Wrapper-Anwendung. Zeilen, die mit jvm 1 beginnen, sind von der JVM-Ausgabe. Die Zahl nach jvm zeigt die JVM-Zahl an, seitdem der Wrapper gestartet wurde. Wir werden sehen, wie dies funktioniert, wenn wir beginnen, den TestWrapper-Dialog zu testen.

Die Konsolenausgabe wird auch komplett in die Datei logs/wrapper.log geloggt. Das geloggte Ausgabeformat unterscheidet sich von dem der Konsolenausgabe jeder Anpassung.

Ausgabe in der Logdatei:
wrapper  | 2001/12/06 16:18:27 | --> Wrapper Started as Console
wrapper  | 2001/12/06 16:18:28 | Launching a JVM...
jvm 1    | 2001/12/06 16:18:29 | Initializing...
jvm 1    | 2001/12/06 16:18:30 | Wrapper (Version 3.x.x)
jvm 1    | 2001/12/06 16:18:30 | 
jvm 1    | 2001/12/06 16:18:30 | start()

Der TestWrapper Anwendung stellt Ihnen eine Zahl von Schaltflächen zur Verfügung. Jeder wird benutzt, um verschiedene Funktionen des Wrappers zu testen. Jede Schaltfläche wird unten mit der Ausgabe, die Sie in der Konsole sehen werden, wenn die Schaltfläche aktiviert ist, beschrieben.

Testen der Wrapper Features (Interne Ausstiege und Probleme)

Dieser Abschnitt präsentiert, wie der Wrapper auf verschiedene Ereignisse antwortet. Jeder dieser Ereignisse kann in der gewohnten Sicherheit Ihres eigenen Zuhauses getestet werden, indem Sie die verschiedenen Schaltflächen des TestWrappers Dialog drücken.

Stop

Beendet die JVM durch den Aufruf von WrapperManager.stop(0) problemlos.

Konsolenausgabe:
wrapper  | --> Wrapper Started as Console
wrapper  | Launching a JVM...
jvm 1    | Initializing...
jvm 1    | Wrapper (Version 3.x.x)
jvm 1    |
jvm 1    | start()
jvm 1    | stop(0)
wrapper  | <-- Wrapper Stopped

Wie Sie sehen können, hat die Anwendung ihre stop() Methode aufgeruft und wurde fehlerfrei beendet.

Exit

Die Exit Schaltfläche testet die Fähigkeit des Wrappers, einen unerwarteten Aufruf der System.exit() abzufangen und die Anwendung problemlos zu beenden.

Konsolenausgabe:
wrapper  | --> Wrapper Started as Console
wrapper  | Launching a JVM...
jvm 1    | Initializing...
jvm 1    | Wrapper (Version 3.x.x)
jvm 1    |
jvm 1    | start()
jvm 1    | stop(0)
jvm 1    | here
wrapper  | <-- Wrapper Stopped

Als eine Aufgabe editieren Sie bitte Ihre conf/wrapper.conf Datei und kommentieren Sie die Eigenschaft aus, wrapper.disable_shutdown_hook=TRUE. ( Stellen Sie sicher, es wieder auszukommentieren, wenn dies erledigt wurde)

Führen Sie nun die TestWrapper-Anwendung wieder aus.

Konsolenausgabe:
wrapper  | --> Wrapper Started as Console
wrapper  | Launching a JVM...
jvm 1    | Initializing...
jvm 1    | Wrapper (Version 3.x.x)
jvm 1    |
jvm 1    | start()
wrapper  | JVM exited unexpectedly.
wrapper  | Launching a JVM...
jvm 2    | Initializing...
jvm 2    | Wrapper (Version 3.x.x)
jvm 2    |
jvm 2    | start()

Sie werden bemerkt haben, dass der Wrapper nicht mehr den Aufruf vonm System.exit() and so the it denkt, dass die JVM abgestürzt ist und startet diese neu.

NOTE

Da Shutdown Hooks von der Java Version 1.2 nicht unterstützt werden, Aufrufe der System.exit führen stets dazu, dass die JVM neu gestartet wird. Um die JVM unter Nutzung der Java 1.2 herunterzufahren, ist es notwendig, den WrapperManager.stop(exitCode) aufzurufen.

NOTE

Wrapper Version 3.4.x oder später unterstützen JVM version 1.4.x und höher. Bitte sehen Sie die Liste der supporteten JVMs (Java Virtual Machines).

Halt

Diese Halt Schaltfläche ruft eine Methode der niedrigeren Ebene auf, um die JVM auf sehr gewzungene Weise zu beenden. In diesem Fall werden Shutdown Hooks nicht ausgeführt und der Wrapper hat keine Möglichkeit, diese abzufangen.

Konsolenausgabe:
wrapper  | --> Wrapper Started as Console
wrapper  | Launching a JVM...
jvm 1    | Initializing...
jvm 1    | Wrapper (Version 3.x.x)
jvm 1    |
jvm 1    | start()
wrapper  | JVM exited unexpectedly.
wrapper  | Launching a JVM...
jvm 2    | Initializing...
jvm 2    | Wrapper (Version 3.x.x)
jvm 2    |
jvm 2    | start()

Bitte beachten Sie, dass der Wrapper denkt, dass die JVM abgestürzt ist und diese neu startet.

Anforderung Neustart

Startet die JVM durch Aufruf von WrapperManager.restart() fehlerfrei neu.

Konsolenausgabe:
wrapper  | --> Wrapper Started as Console
wrapper  | Launching a JVM...
jvm 1    | Initializing...
jvm 1    | Wrapper (Version 3.x.x)
jvm 1    |
jvm 1    | start()
wrapper  | JVM requested a restart.
jvm 1    | stop(0)
wrapper  | Launching a JVM...
jvm 2    | Initializing...
jvm 2    | Wrapper (Version 3.x.x)
jvm 2    |
jvm 2    | start()

Wie Sie sehen können, hat die Anwendung Ihre stop() Methode aufgerufen und wurde fehlerfrei neu gestartet.

Zugriffsverletzung

Dies nutzt einen Bug in der 1.3 Sun JVM, um eine sofortige Zugriffsverletzung in der JVM zu verursachen. (Dies funktioniert nicht in der IBM JVM.).

Konsolenausgabe (Oracle JVM):
wrapper  | --> Wrapper Started as Console
wrapper  | Launching a JVM...
jvm 1    | Initializing...
jvm 1    | Wrapper (Version 3.x.x)
jvm 1    |
jvm 1    | start()
jvm 1    | WARNING: Attempting to cause an access violation...
jvm 1    | #
jvm 1    | # HotSpot Virtual Machine Error, EXCEPTION_ACCESS_VIOLATION
jvm 1    | # Please report this error at
jvm 1    | # http://java.sun.com/cgi-bin/bugreport.cgi
jvm 1    | #
jvm 1    | # Error ID: 4F533F57494E13120E43505002D4
jvm 1    | #
jvm 1    |
jvm 1    | abnormal program termination
wrapper  | JVM exited unexpectedly.
wrapper  | Launching a JVM...
jvm 2    | Initializing...
jvm 2    | Wrapper (Version 3.x.x)
jvm 2    |
jvm 2    | start()

Wie Sie sehen können, verursachte eine Zugriffsverletzung, dass die JVM einen Fehler-Dump zurückgibt und sich dann beendet. Der Wrapper entdeckt dies sofort und startet nach einer Pause von 5 Sekunden die Anwendung in einer neuen JVM neu, wie in der jvm 2 gesehen werden kann. Alle verfügbaren Informationen bezüglich des Absturzes wurde für zukünftige Referenz geloggt.

Native Zugriffsverletzung

Der Java Service Wrapper beinhaltet eine leichtgewichtige native library die genutzt wird, um mit Systemereignissen umzugehen. Die Bibliothek beinhaltet auch eine native Methode, welche fürs Testen genutzt wird, um eine Zugriffsverletzung in nativem Programmcode aufgrund einer "NULL" Referenz zu verursachen.

Abhängig von der JVM wird dies eine unterschiedliche Ausgabe ausgeben. In dem Beispiel unten, erstellte die JVM einen Core Dump, der eine Minute zum Speichern brauchte. Während dieser Zeit erscheint die JVM, zu hängen, so dass der Wrapper sie zwangsweise beendet und neu startet.

Konsolenausgabe:
wrapper  | --> Wrapper Started as Console
wrapper  | Launching a JVM...
jvm 1    | Initializing...
jvm 1    | Wrapper (Version 3.x.x)
jvm 1    |
jvm 1    | start()
jvm 1    | WARNING: Attempting to cause an access violation...
jvm 1    | #
jvm 1    | # An EXCEPTION_ACCESS_VIOLATION exception has been detected in native code outside the VM.
jvm 1    | # Program counter=0x8f7105f
jvm 1    | #
wrapper  | JVM is hung: Timed out waiting for signal from JVM.
wrapper  | JVM did not exit on request, terminated
wrapper  | Launching a JVM...
jvm 2    | Initializing...
jvm 2    | Wrapper (Version 3.x.x)
jvm 2    |
jvm 2    | start()

Simulieren des Aufhängen der JVM

Dieser Test veranlässt den Wrapper zu denken, dass die JVM ´sich aufgehängt hat. Nach 30 Sekunden bekommt der Wrapper einen Time-out und entscheidet, dass die JVM sich nicht wieder meldet und startet sie neu.

Konsolenausgabe:
wrapper  | --> Wrapper Started as Console
wrapper  | Launching a JVM...
jvm 1    | Initializing...
jvm 1    | Wrapper (Version 3.x.x)
jvm 1    |
jvm 1    | start()
jvm 1    | WARNING: Making JVM appear to be hung...
wrapper  | JVM appears hung: Timed out waiting for signal from JVM.
wrapper  | JVM did not exit on request, terminated
wrapper  | Launching a JVM...
jvm 2    | Initializing...
jvm 2    | Wrapper (Version 3.x.x)
jvm 2    |
jvm 2    | start()

Testen von Wrapper Features (External Exits)

Der oben genannte Abschnitt behandelte alle Möglichkeiten, auf die eine Anwendung aussteigen oder sich durch ihr eigenes Tun beenden kann. Es gibt andere externe Faktoren gegen die sich der Wrapper auch selbst schützen kann.

CTRL-C

Meiste Java-Anwendungen beenden sich abrupt, wenn der User STRG-C drückt, sich aus Windows ausloggt, etc. Sie können sich bei einigen von diesen Punkten mit einem Shutdown Hook behelfen. Der Wrapper implementiert dies, indem er von einer native library Nutzen zieht, um direkt Systemsignale abzufangen. Dies ermöglicht es, eine Java-Anwendung als einen Windows-Dienst installiert zu haben, ohne dass dieser gestoppt wird, wenn sich ein User ausloggt.

Als einen Test drücken Sie STRG-C in der Konsole (Befehlsfenster).

Konsolenausgabe:
wrapper  | --> Wrapper Started as Console
wrapper  | Launching a JVM...
jvm 1    | Initializing...
jvm 1    | Wrapper (Version 3.x.x)
jvm 1    |
jvm 1    | start()
wrapper  | CTRL-C trapped.  Shutting down.
jvm 1    | stop(0)
wrapper  | <-- Wrapper Stopped

Sie können dbzgl. Variationen sehen, indem Sie sich ausloggen während die Konsolenanwendung noch läuft. Der Wrapper wird die Anwendung korrekt beenden.

Konsolenausgabe:
wrapper  | Launching a JVM...
jvm 1    | Initializing...
jvm 1    | Wrapper (Version 3.x.x)
jvm 1    | 
jvm 1    | start()
wrapper  | User logged out.  Shutting down.
jvm 1    | stop(0)
wrapper  | <-- Wrapper Stopped

Auf Linux oder Solaris Plattformen können Sie nur STRG-C drücken, wenn das Skript, welches gewöhnlich zum Starten des Wrappers genutzt wird, nach dem Konsolenbefehl ausgeführt würde.

Wenn der Wrapper via start Befehl gestartet wurde, dann wurde er in einem unterschiedlichen Prozess als Dienst/Daemon erzeugt, so dass Sie auf die Konsole nicht mehr zugreifen können. Um die erzeugten Instanzen des Wrappers zu beenden, führen Sie bitte das gleiche Skript aus, welches Sie zum Starten des Wrappers benutzten; nur dieses Mal spezifizieren Sie den stop STOP Befehl:

Konsolenausgabe:
wrapper  | --> Wrapper Started as Console
wrapper  | Launching a JVM...
jvm 1    | Initializing...
jvm 1    | Wrapper (Version 3.x.x)
jvm 1    |
jvm 1    | start()
wrapper  | Shutting down.
jvm 1    | stop(0)
wrapper  | <-- Wrapper Stopped

Prozessbeendigung

Es ist auch möglich, obwohl unwahrscheinlich, dass der Anwendungsprozess von einer anderen Anwendung beendet wurde. Dieser Test simuliert Fälle, in denen die JVM sich sehr plötzlich auf ihr eigene Festlegung hin beendet. Auf UNIX-Systemen können Sie den Java Prozess zwangsweise mit einem kill -9 Befel beenden. Auf Windows-Systemen öffnen Sie den Task Manager und wählen dann die Registerkarte Prozesse aus. Danach finden Sie den java.exe Prozess, um diesen zwangsweise zu beenden.

Konsolenausgabe:
wrapper  | --> Wrapper Started as Console
wrapper  | Launching a JVM...
jvm 1    | Initializing...
jvm 1    | Wrapper (Version 3.x.x)
jvm 1    |
jvm 1    | start()
wrapper  | JVM exited unexpectedly.
wrapper  | Launching a JVM...
jvm 2    | Initializing...
jvm 2    | Wrapper (Version 3.x.x)
jvm 2    |
jvm 2    | start()

Der Wrapper sollte dann die JVM ohne Probleme neustarten.

Wenn anstatt dem Java-Prozess der Wrapper-Prozess zwangsweise beendet wurde, dann gibt es aktuell keinen Wiederherstellungsmodus. Der WrapperManager innerhalb des Java-Prozesses reagiert auf den Verlust des Wrappers, indem er annimmt, dass der Java-Prozess herrenlos geworden ist. Dies führt dazu, dass die JVM, 30 Sekunden nachdem der Wrapper-Prozess abgestorben ist, problemlos beendet wird.

System unter hoher Last oder bei Systemunterbrechungen

Es gibt Fälle, wo entweder dem Wrapper, der JVM oder beiden CPU-Laufzeiten für einen ausgedehnten Zeitraum verwehrt werden. Dies kann passieren, wenn ein ressourcenunfreundlicher Prozess anfängt, 100% Prozessorleistung für eine bestimmte Zeitdauer zu beanspruchen. Dies kann auch auftreten, wenn der User das System unter Nutzung von Arbeits- oder Festplattenspeicher unterbricht. Wenn das System fortgesetzt wird, werden alle laufenden Anwendungen etwas Zeitverlust erfahren haben. Der Wrapper ist imstande, zu erkennen, dass dies auftrat und ermöglicht es daher, unnötige Neustarts des JVM-Prozesses zu vermeiden. Die folgende Ausgabe zeigt, was passiert, wenn das System für 255 Sekunden in einen vorübergehenden Unterbrechungsmodus unter Nutzung des RAM wechselt, bevor der Systembetrieb wieder aufgenommen wird.

Konsolenausgabe:
wrapper  | --> Wrapper Started as Console
wrapper  | Launching a JVM...
jvm 1    | Initializing...
jvm 1    | Wrapper (Version 3.x.x)
jvm 1    |
jvm 1    | start()
jvm 1    | JVM Process has not received any CPU time for 255 seconds.  Extending timeouts.
wrapper  | Wrapper Process has not received any CPU time for 255 seconds.  Extending timeouts.

Ausführen als ein Windows Dienst

Beim Ausführen als ein Windows Dienst wird es der TestWrapper Beispielanwendung unmöglich sein, ihren Dialog anzuzeigen. So ist dieser TestWrapper Anwendung nicht sehr interessant. Wir können jedoch ein paar Tests laufen lassen, um zu prüfen, ob der Wrapper als Windows Dienst korrekt läuft.

Der erste Schritt, der getan werden muss, ist der, die TestWrapper Anwendung als einen Windows Dienst zu installieren, indem folgender Befehl ausgeführt wird:

Befehl:
InstallTestWrapper-NT.bat
Sie werden die Ausgabe sehen:
wrapper  | TestWrapper Application installed.

Sobald die TestWrapper Anwendung als ein Dienst installiert wurde, werden wir sie starten wollen.

Befehl:
net start TestWrapper
Sie werden die Ausgabe sehen:
The TestWrapper Application service is starting.
The TestWrapper Application service was started successfully.

Der Dienst kann durch Ausführen des folgenden Befehls deinstalliert werden:

UninstallTestWrapper-NT.bat
Wenn der Dienst ausgeführt wird, werden Sie die folgende Ausgabe sehen:
wrapper  | Service is running.  Stopping it...
wrapper  | Waiting to stop...
wrapper  | TestWrapper Application stopped.
wrapper  | TestWrapper Application removed.

Wenn Sie den Inhalt der logs/wrapper.log ansehen, werden Sie eine Ausgabe sehr ähnlich zu der der Konsole sehen. Mit der Ausnahme, dass dieses Mal die Startmeldung Sie darüber informiert, dass die Anwendung als ein Dienst gestartet wurde.

wrapper.log
wrapper  | 2001/12/06 17:34:21 | --> Wrapper Started as Service
wrapper  | 2001/12/06 17:34:21 | Launching a JVM...
jvm 1    | 2001/12/06 17:34:22 | Initializing...
jvm 1    | 2001/12/06 17:34:22 | Wrapper (Version 3.x.x)
jvm 1    | 2001/12/06 17:34:22 |
jvm 1    | 2001/12/06 17:34:22 | start()

Hier sind die Ergebnisse von einigen mehr Aktionen, die als Windows Dienst stattfinden können:

Aus- und Einloggen von Usern

Ein Logeintrag wird vorgenommen, wenn der User sich einloggt, aber der Dienst bleibt davon unberührt.

wrapper.log
wrapper  | 2001/12/06 17:39:39 | --> Wrapper Started as Service
wrapper  | 2001/12/06 17:39:40 | Launching a JVM...
jvm 1    | 2001/12/06 17:39:40 | Initializing...
jvm 1    | 2001/12/06 17:39:40 | Wrapper (Version 3.x.x)
jvm 1    | 2001/12/06 17:39:40 |
jvm 1    | 2001/12/06 17:39:41 | start()
wrapper  | 2001/12/06 17:40:07 | User logged out.  Ignored.
jvm 1    | 2001/12/06 17:40:07 | controlEvent(202)

Neustarten der Maschine

Dies führt zu einem "logout" Signal gefolgt von einem "shutdown" signal. Der Dienst wird problemlos beendet und dann nach einem Neustart der Maschine wieder gestartet.

Ein Logeintrag wird vorgenommen, wenn der User sich einloggt; aber der Dienst bleibt davon unberührt.

wrapper.log
wrapper  | 2001/12/06 17:41:04 | --> Wrapper Started as Service
wrapper  | 2001/12/06 17:41:05 | Launching a JVM...
jvm 1    | 2001/12/06 17:41:05 | Initializing...
jvm 1    | 2001/12/06 17:41:05 | Wrapper (Version 3.x.x)
jvm 1    | 2001/12/06 17:41:05 |
jvm 1    | 2001/12/06 17:41:05 | start()
wrapper  | 2001/12/06 17:41:25 | User logged out.  Ignored.
jvm 1    | 2001/12/06 17:41:26 | controlEvent(202)
wrapper  | 2001/12/06 17:41:27 | Machine is shutting down.
jvm 1    | 2001/12/06 17:41:27 | controlEvent(203)
jvm 1    | 2001/12/06 17:41:28 | stop(0)
wrapper  | 2001/12/06 17:41:29 | <-- Wrapper Stopped
wrapper  | 2001/12/06 17:44:12 | --> Wrapper Started as Service
wrapper  | 2001/12/06 17:44:12 | Launching a JVM...
jvm 1    | 2001/12/06 17:44:17 | Initializing...
jvm 1    | 2001/12/06 17:44:21 | Wrapper (Version 3.x.x)
jvm 1    | 2001/12/06 17:44:21 |
jvm 1    | 2001/12/06 17:44:23 | start()

Ausführen als ein Linux / Solaris Dienst

Es gibt keine Unterschiede zwischen Ausführen als ein Dienst verglichen mit dem Ausführen einer Konsolenanwendung in einer UNIX Umgebung.