Ausführen der TestWrapper-Beispielanwendung

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

Ausführen in einer Konsole

Um das Beispiel in einer Konsole auszuführen, führen Sie das folgende Skript aus, welches sich im bin-Verzeichnis befindet:

Windows:
TestWrapper.bat
Unix:
./testwrapper console

NOTE

Vor der Version 3.0.5, versuchte das testwrapper-Skript unter UNIX eine PID-Datei in das /var/run.Verzeichnis zu schreiben. Benutzer, die kein root sind, müssten die PIDDIR-Variable des Skripts auf ein Verzeichnis ändern, in dem Sie die passenden Berechtigungen hätten. Dies ist seit der Version 3.0.5 kein Problem mehr, das der Wrapper die PID-Datei in den gleichen Speicherort wie das Skript schreibt.

Wenn die Anwendung startet, wird das folgende Fenster erscheinen:

Sie sollten auch die folgende Ausgabe 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 Zahl der gestarteten JVMs an, seitdem der Wrapper gestartet wurde. Wir werden sehen, wie dies funktioniert, wenn wir beginnen, mit der TestWrapper-Benutzerschnittstelle zu spielen.

Standardmäßig wird die komplette Konsolenausgabe auch in der Datei logs/wrapper.log geloggt. Jedoch ist das Format der Protokolldatei konfiguriert, auch die Protokollierungsstufe und die Zeitstempel für jede geloggte Nachricht miteinzuschließen.

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

Es ist möglich, das Format sowohl die Protokollierungsstufe für jede Ausgabe separat neu zu konfigurieren. Dies kann durch die Nutzung der folgenden Eigenschaften getan werden:

Standardmäßig stellt die TestWrapper-Anwendung Ihnen eine Benutzerschnittstelle zur Verfügung, die mehrere Schaltflächen anzeigt, um die verschiedenen Funktionalitäten 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.

Als eine Alternative zur GUI, kann die TestWrapper-Anwendung ausschließlich von einem Terminal aus gesteuert werden. Dieser Modus, genannt'console', hat die gleichen Funktionalitäten wie die GUI, aber die Anwendung wartet dabei auf Benutzereingaben, und die Tests können durch das Schreiben von Befehlen in das Terminal statt Klicken auf Schaltflächen ausgelöst werden.

TestWrapper-Anwendung ausgeführt in einem 'console'-Modus:
jvm 1    | WrapperManager: Initializing...
jvm 1    | TestWrapper: Initializing...
jvm 1    | TestWrapper: start()
jvm 1    | TestWrapper: ActionServer Enabled.
jvm 1    | TestWrapper:   Telnet localhost 9999
jvm 1    | TestWrapper:   Commands:
jvm 1    | TestWrapper:     S: Shutdown
jvm 1    | TestWrapper:     H: Expected Halt
jvm 1    | TestWrapper:     R: Restart
jvm 1    | TestWrapper:     D: Thread Dump
jvm 1    | TestWrapper:     U: Unexpected Halt (Simulate crash)
jvm 1    | TestWrapper:     V: Access Violation (Actual crash)
jvm 1    | TestWrapper:     G: Make the JVM appear to be hung.
jvm 1    | TestWrapper:
jvm 1    |
jvm 1    | Start prompting for actions.
jvm 1    | Input an action ('help' for a list of actions):
help
jvm 1    | Read action: help
jvm 1    |
jvm 1    | [ACTIONS]
jvm 1    |    help                     : Shows this help message
jvm 1    |   Actions which should cause the Wrapper to exit cleanly:
jvm 1    |    stop0                    : Calls WrapperManager.stop(0)
jvm 1    |    exit0                    : Calls System.exit(0)
jvm 1    |    stopimmediate0           : Calls WrapperManager.stopImmediate(0)
jvm 1    |    stopandreturn0           : Calls WrapperManager.stopAndReturn(0)
jvm 1    |   Actions which should cause the Wrapper to exit in an error state:
jvm 1    |    stop1                    : Calls WrapperManager.stop(1)
jvm 1    |    exit1                    : Calls System.exit(1)
jvm 1    |    nestedexit1              : Calls System.exit(1) within WrapperListener.stop(1) callback
jvm 1    |    stopimmediate1           : Calls WrapperManager.stopImmediate(1)
jvm 1    |   Actions which should cause the Wrapper to restart the JVM:
jvm 1    |    access_violation_native  : Calls WrapperManager.accessViolationNative()
jvm 1    |    appear_hung              : Calls WrapperManager.appearHung()
jvm 1    |    halt0                    : Calls Runtime.getRuntime().halt(0)
jvm 1    |    halt1                    : Calls Runtime.getRuntime().halt(1)
jvm 1    |    restart                  : Calls WrapperManager.restart()
jvm 1    |    restartandreturn         : Calls WrapperManager.restartAndReturn()
jvm 1    |   Additional Tests:
jvm 1    |    appear_slow_1            : Calls WrapperManager.appearSlow(1)
jvm 1    |    appear_slow_5            : Calls WrapperManager.appearSlow(5)
jvm 1    |    appear_slow_reset        : Calls WrapperManager.appearSlow(0) to return to normal
jvm 1    |    deadlock                 : Executes some deadlocking code to test deadlock detection
jvm 1    |    outofmemory              : Simulates an OutOfMemoryError being thrown
jvm 1    |    ignore_events            : Makes this application ignore control events.
jvm 1    |    dump                     : Calls WrapperManager.requestThreadDump()
jvm 1    |    deadlock_out             : Deadlocks the JVM's System.out and err streams.
jvm 1    |    users                    : Start polling the current and interactive users.
jvm 1    |    groups                   : Start polling the current and interactive users with groups.
jvm 1    |    console                  : Prompt for actions in the console.
jvm 1    |    idle                     : Do nothing just run in idle mode.
jvm 1    |    properties               : Dump all System Properties to the console.
jvm 1    |    configuration            : Dump all Wrapper Configuration Properties to the console.
jvm 1    |    gc                       : Perform a GC sweep.
jvm 1    |    is_professional          : Displays whether or not this is a Professional Edition Wrapper.
jvm 1    |    is_standard              : Displays whether or not this is at least a Standard Edition Wrapper.
jvm 1    |    exec <cmd>               : Executes a managed child process.
jvm 1    |    exec_detached <cmd>      : Executes a detached child process.

Um die Anwendung im 'console'-Modus zu starten, sollten Sie ein zusätzliches 'console'-Argument hinzufügen. Unter UNIX sollte dieses Argument nicht mit dem 'console'-Befehl verwechselt werden, welches dem Skript übergeben wird (das Wort 'console' sollte in dieser Weise beim Starten des Skripts zweimal wiederholt werden).

Windows:
TestWrapper.bat console
Unix:
./testwrapper console console

Sie können die Anwendung jederzeit durch Schließen des Fensters oder durch die "Stop()"- und "Exit()"-Schaltflächen beenden. Sie können im Terminal auch STRG-C drücken, um ein ordnungsgemäßes Beenden anzufordern.

Testen der Wrapper-Features (Interne Ausstiege und Probleme)

Dieser Abschnitt zeigt, wie der Wrapper auf verschiedene Ereignisse antwortet. Jeder dieser Ereignisse kann durch Drücken der Schaltflächen der Benutzeroberfläche getestet werden.

Stop

Beendet ordnungsgemäß die JVM durch den Aufruf von WrapperManager.stop(0).

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 aufgerufen 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 Übung 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 Sie damit fertig sind)

Führen Sie jetzt noch einmal die TestWrapper-Anwendung 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 von System.exit() abfängt. Daher denkt er, dass die JVM abgestürzt ist und startet diese neu.

Halt

Diese Halt-Schaltfläche ruft eine Methode auf einem sehr niedrigen Niveau auf, um die JVM zwangsweise 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 sie deshalb neu startet.

Neustart anfordern

Startet die JVM durch Aufruf von WrapperManager.restart() ordnungsgemäß 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 ordnungsgemäß neu gestartet.

Native Zugriffsverletzung

Der Java Service Wrapper beinhaltet eine leichtgewichtige native Bibliothek 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.

Konsolenausgabe (Oracle JVM):
wrapper  | -->jvm 1    | WrapperManager: WARNING: Attempting to cause an access violation...
jvm 1    | #
jvm 1    | # A fatal error has been detected by the Java Runtime Environment:
jvm 1    | #
jvm 1    | #  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007fffc9aee46f, pid=14352, tid=12948
jvm 1    | #
jvm 1    | # JRE version: Java(TM) SE Runtime Environment (8.0_45-b15) (build 1.8.0_45-b15)
jvm 1    | # Java VM: Java HotSpot(TM) 64-Bit Server VM (25.45-b02 mixed mode windows-amd64 compressed oops)
jvm 1    | # Problematic frame:
jvm 1    | # C  [wrapper.dll+0xe46f]  Java_org_tanukisoftware_wrapper_WrapperManager_accessViolationInner+0x1f
jvm 1    | #
jvm 1    | # Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
jvm 1    | #
jvm 1    | # An error report file with more information is saved as:
jvm 1    | # C:\wrapper\bin\hs_err_pid14352.log
jvm 1    | #
jvm 1    | # If you would like to submit a bug report, please visit:
jvm 1    | #   http://bugreport.java.com/bugreport/crash.jsp
jvm 1    | # The crash happened outside the Java Virtual Machine in native code.
jvm 1    | # See problematic frame for where to report the bug.
jvm 1    | #
wrapper  | JVM exited unexpectedly.
wrapper  | Launching a JVM...
jvm 2    | WrapperManager: Initializing...
jvm 2    | TestWrapper: Initializing...

Wie Sie sehen können, verursachte eine Zugriffsverletzung, dass die JVM einen Fehler-Speicherauszug 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. Jede verfügbare Information bezüglich des Absturzes wurde als künftige Referenz geloggt.

Simulation eines Hängers der JVM

Dieser Test bewirkt, dass der Wrapper glaubt, dass die JVM sich aufgehängt hat. Nach 30 Sekunden erfährt der Wrapper einen Timeout und kommt zur Feststellung, dass die JVM nicht mehr erreichbar ist 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()

Test der Wrapper-Features (Externe Ausstiege)

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.

STRG-C

Die meisten Java-Anwendungen beenden sich eher abrupt, wenn der User STRG-C drückt, sich von Windows abmeldet etc. Sie können sich bei einigen dieser Probleme mit einem Shutdown Hook behelfen. Der Wrapper implementiert dies durch Nutzung einer nativen Bibliothek, um die Systemsignale direkt abzufangen. Dies ermöglicht es, eine Java-Anwendung als einen Windows Dienst installiert zu haben, ohne dass dieser beendet werden muss, wenn ein Benutzer sich abmeldet.

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

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 Unix-Plattformen können Sie nur STRG-C drücken, wenn dem Skript, welches gewöhnlich den Wrapper startet, der 'console'-Befehl übergeben wurde.

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

Beenden von Prozess

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 von selbst beendet. Auf UNIX-Systemen können Sie den Java-Prozess zwangsweise mit einem kill -9-Befehl 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 dann 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 wird der WrapperManager im Wiederherstellungsmodus sein. Der WrapperManager innerhalb des Java-Prozesses reagiert auf den Verlust des Wrappers, indem er annimmt, dass der Java-Prozess aufgegeben worden ist. Dies führt dazu, dass die JVM 30 Sekunden nachdem der Wrapper-Prozess abgestorben ist, ordnungsgemäß beendet wird.

Hohe Auslastung des Systems oder Systemunterbrechung

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

Ab der Wrapper Version 3.1.0 wurde ein neuer Timermechanismus hinzugefügt, der es dem Wrapper erlaubt, mit Fällen unzugehen, in denen er selbst in einem bzgl. der CPU ausgehungerten Zustand zuverlässig ausgeführt wird, weil der Ticken-Zähler in einer Rate hochgezählt wird, welche eher den erhaltenen als den absoluten CPU-Betrag wiedergibt. Dies bedeutet, dass Timeouts wegen hoher Belastung sehr unwahrscheinlich sind. Stellen Sie einfach sicher, dass die Eigenschaft wrapper.use_system_time auf FALSE gesetzt ist, damit der Timermechanismus aktiviert ist.

Ausführen als ein Windows Dienst

Beim Ausführen als ein Windows Dienst wird es der TestWrapper Beispielanwendung unmöglich sein, ihren Dialog anzuzeigen. Dies hindert Sie daran, die oben beschriebenen Tests zu starten. 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 die TestWrapper-Anwendung durch Ausführung des folgenden Befehls als einen Windows Dienst zu installieren:

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

Sobald die TestWrapper-Anwendung als ein Dienst installiert ist, 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 statt als eine Konsole 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 Protokolleintrag wird vorgenommen, wenn der User sich ausloggt; 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()

Lesen Sie bitte diese Seite für detaillierte Informationen dazu, wie der Wrapper als ein Windows-Dienst gesteuert werden kann.

Ausführen als ein Unix Daemon

Der Wrapper kann durch den 'start'-Befehl gestartet werden, um im Hintergrund ausgeführt zu werden. Wenn er von einem Terminal, der keine GUI anzeigen kann, aus gestartet wird, wird die Anwendung zu seinem Konsolenmodus wechseln, aber dies ist nicht so nützlich, da der Daemon nicht von der Konsole aus gesteuert werden kann.

Unix:
./testwrapper start

Sobald die Anwendung gestartet ist, kann die Benutzeroberfläche der TestWrapper-Anwendung, ausgeführt als ein Daemon, genauso genutzt werden, wie als würde eine Konsolenanwendung ausgeführt.

Um die Wrapper-Instanzen, die als ein Daemon laufen, anzuhalten, nutzen Sie bitte das gleiche Skript mit dem 'stop'-Befehl.

Unix:
./testwrapper stop

Lesen Sie bitte diese Seite für eine komplette Beschreibung der Befehle, die genutzt werden können, um den Wrapper zu steuern, als Unix Daemon ausgeführt zu werden.