Java selbst ist ein sehr großes Programm, welches ein Betriebssystem in seiner ganzen Komplexität anspricht. Während es gewöhnlich sehr stabil ist, hat es wie jedes Programm gelegentlich Probleme wie Systemabstürze, Freeze-Stillstände etc. Wenn ein Java-Anwendungsprozess hängt, kann es schwierig sein, dies zu entdecken und den Originalzustand wiederherzustellen. Weil der Java-Prozess selbst im Hintergrund fortbesteht, kann die Überwachungssoftware annehmen, dass der Prozess weiterhin besteht, obwohl dieser aufgehört hat, zu antworten.

Wenn die JVM hängt, bemerken dies gewöhnlich Nutzer und andere Systeme, denen es nicht gelingt mit anderen in Interaktion zu treten. Sobald man über das Problem in Kenntnis gesetzt wird, was oft durch die Reklamation eines Nutzers geschieht, muss ein Systemadministrator sich dann mit dem Server verbinden, um die aufgehängte JVM zwangsweise zu beenden und die Anwendung neuzustarten. Dies alles kann wahrscheinlich ein paar Stunden Zeit in Anspruch nehmen, wenn die Person, die die Arbeit normalerweise erledigt, sich beim Abendessen befindet.

Lösung

Die Lösung dieses Problems ist es, eine Überwachungssoftware zu haben, die ein tiefergehendes Wissen darüber hat, wie Java funktioniert und der vertraut werden kann, dass diese Java-Anwendung 24 Stunden am Tag, 365 Tage in einem Jahr überwachen und sich automatisch um Probleme kümmern kann, wenn sie auftreten.

Der Java Service Wrapper enthält verschiedene Überwachung-Features. Eines dieser ist die Fähigkeit, festzustellen, wann eine JVM aufgehängt ist. Der Wrapper überwacht permanent eine JVM, und beinhaltet fortgeschrittene Logik, um zu entscheiden, ob eine JVM aufgehängt ist oder nicht. Wenn eine aufgehängte JVM festgestellt wurde, ist der Wrapper imstande, die JVM automatisch neu zu starten, um das System wieder mit einem Minimum an Verzögerung zum Laufen zu bringen. Der Wrapper kann dann eine Email-Benachrichtigung an die Systemadministratoren versenden - für den Fall, dass diese wünschen, sicherzustellen, dass alles wieder normal läuft.

Der Java Service Wrapper pingt regelmässig den JVM-Prozess (Standardmässig alle 5 Sekunden) und wartet auf eine Antwort. Wenn die Antwort nicht innerhalb einer konfigurierten Zeitdauer (Standardmässig 30 Sekunden) erhalten wird, dann stellt der Wrapper fest, dass diese aufgehängt ist. Der Wrapper berücksichtigt auch Dinge, wie die gesamte Systemlast, um sicherzustellen, dass falsche positive Aussagen auf ein Minimum reduziert gehalten werden können.

Wenn eine Freeze-Erkennung erfolgreich war, wird der Wrapper etwas wie folgt in der Log-Datei loggen:

Beispiellog Absturz und Neustart:
jvm 1    | ...
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    | WrapperManager: Initializing...
jvm 2    | ...

Der Wrapper hilft Ihnen, kritische Probleme inklusive Folgenden zu entdecken:

Technische Übersicht

Die Freeze-Erkennung ist standardmäßig aktiviert. Es wird versuchen, die JVM alle 5 Sekunden anzupingen und dann nach 30 Sekunden ohne Antwort einen Timeout haben. Beide dieser Zeitintervalle sind einstellbar. Wenn Sie die wrapper.debug=TRUE Eigenschaft setzen, sind Sie in der Lage, die Pings in der Logdatei zu sehen. In diesem Beispiel wurde das Log-Format so eingestellt, dass dieses auch Zeitstempel beinhaltet.

Beispiellog von Pings:
INFO   | jvm 1    | 2012/05/09 18:28:11 | ...
DEBUG  | wrapperp | 2012/05/09 18:28:13 | send a packet PING : ping
INFO   | jvm 1    | 2012/05/09 18:28:13 | WrapperManager Debug: Received a packet PING : ping
INFO   | jvm 1    | 2012/05/09 18:28:13 | WrapperManager Debug: Send a packet PING : ping
DEBUG  | wrapperp | 2012/05/09 18:28:13 | read a packet PING : ping
DEBUG  | wrapperp | 2012/05/09 18:28:18 | send a packet PING : ping
INFO   | jvm 1    | 2012/05/09 18:28:18 | WrapperManager Debug: Received a packet PING : ping
INFO   | jvm 1    | 2012/05/09 18:28:18 | WrapperManager Debug: Send a packet PING : ping
DEBUG  | wrapperp | 2012/05/09 18:28:18 | read a packet PING : ping
DEBUG  | wrapperp | 2012/05/09 18:28:21 |...

Freeze-Erkennung

Kompatibel :1.0.0
Editionen :Professional EditionStandard EditionCommunity Edition
Betriebssysteme :WindowsMac OSXLinuxIBM AIXFreeBSDHP-UXSolarisIBM z/OSIBM z/Linux

Das Pingen der JVM ist ein sehr leichtgewichtiges Feature, und es wird empfohlen, die JVM in standardmäßig 5-Sekunden-Zeiträumen zu überwachen. Abhängig von Ihrer Anwendung, oder in Fällen, wenn Ihr System unter sehr großer externer Datenlast ist, kann es notwendig sein, den Ping-Timeout-Zeitraum zu verlängern. Bitte sind Sie sich bewusst, dass dadurch die Zeitdauer, die der Wrapper braucht, um festzustellen, dass die JVM aufgehängt ist, zunimmt.

Bitte beachten Sie, dass wenn eine JVM hängt, wie dieses Beispiel zeigt, diese aufhört, auf alle Pings zu antworten und der Wrapper einen Neustart einleiten wird :

Beispiellog: Freeze-Stillstand und Neustart.
DEBUG  | wrapperp | 2012/05/09 19:20:22 | send a packet PING : ping
INFO   | jvm 1    | 2012/05/09 19:20:22 | WrapperManager Debug: Received a packet PING : ping
INFO   | jvm 1    | 2012/05/09 19:20:22 | WrapperManager Debug: Send a packet PING : ping
DEBUG  | wrapperp | 2012/05/09 19:20:22 | read a packet PING : ping
DEBUG  | wrapperp | 2012/05/09 19:20:27 | send a packet PING : ping
DEBUG  | wrapperp | 2012/05/09 19:20:31 | send a packet PING : ping
DEBUG  | wrapperp | 2012/05/09 19:20:36 | send a packet PING : ping
DEBUG  | wrapperp | 2012/05/09 19:20:40 | send a packet PING : ping
DEBUG  | wrapperp | 2012/05/09 19:20:44 | send a packet PING : ping
DEBUG  | wrapperp | 2012/05/09 19:20:49 | send a packet PING : ping
DEBUG  | wrapperp | 2012/05/09 19:20:53 | send a packet PING : ping
DEBUG  | wrapperp | 2012/05/09 19:20:58 | send a packet PING : ping
ERROR  | wrapper  | 2012/05/09 19:20:59 | JVM appears hung: Timed out waiting for signal from JVM.
ERROR  | wrapper  | 2012/05/09 19:21:00 | JVM did not exit on request, terminated

Testen

Hoffentlich werden Sie ein Hängen der JVM eher selten in Ihrer eigenen Java-Anwendung erleben. Um es zu erleichtern, dies zu überprüfen, wird der Wrapper mit einer TestWrapper Beispielanwendung ausgeliefert, die dazu benutzt werden kann, dies und viele anderen Features auszuprobieren.

Bitte starten Sie dazu die TestWrapper-Anwendung von einer Konsole, indem Sie in das Verzeichnis der heruntergeladenen und entpackten Java Service Wrapper Distribution wechseln. In Windows führen Sie die bin\TestWrapper.bat aus und auf UNIX-Plattformen starten Sie bitte die bin\testwrapper console.

Wenn die TestWrapper Beispielanwendung startet, sollten Sie einen einfachen grafischen Bildschirm mit mehreren Schaltflächen unten links sehen. Das Klicken auf die Simulate JVM Hang-Schaltfläche sorgt dafür, dass die JVM gegenüber dem Wrapper als aufgehängt erscheint.

Beispiellog: Freeze-Stillstand und Neustart.
jvm 1    | TestWrapper: Showing dialog...
jvm 1    | WrapperManager: 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    | WrapperManager: Initializing...
jvm 2    | TestWrapper: Initializing...

Wenn Sie dies in Ihrer eigenen Java-Anwendung testen möchten, ist es möglich, den WrapperManager.appearHung() aufzurufen, um in diesen Test-Modus zu gelangen.

Auf Ereignisse antworten

Kompatibel :3.3.0
Editionen :Professional EditionStandard Edition (Not Supported)Community Edition (Not Supported)
Betriebssysteme :WindowsMac OSXLinuxIBM AIXFreeBSDHP-UXSolarisIBM z/OSIBM z/Linux

Manchmal, wenn eine Anwendung hängt oder abstürzt, ist es nicht so einfach, die Anwendung neu zu starten. Wenn temporäre Dateien nicht sauber aufgeräumt werden, oder die Datenbank sich in einem unstabilen Zustand befindet, kann das Starten einer neuen Anwendungsinstanz schnell mit Fehlern abbrechen. Idealerweise sollte die Anwendung genügend robust konzipiert sein, um mit solchen Fehlern umgehen zu können, jedoch ist dies nicht immer möglich. In solchen Fällen brauchen wir einen Weg, um Aufräumarbeiten erledigt zu bekommen, bevor eine neue JVM gestartet wird.

Der Wrapper unterstützt dies durch die Nutzung von Ereignisbefehlen. Der Wrapper kann angewiesen werden, einen externen Befehl oder ein externes Skript zu unterschiedlichen Zeiten auszuführen.

Wenn Sie in die Debuglog-Ausgabe sehen, werden Sie gelegentliche Enqueue Event 'NNN' Einträge sehen. Diese geben die Zeiten an, zu denen die Wrapper Ereignisse gestartet wurden. Im Fall von Neustarts nach Erkennung einer aufgehängten JVM wollen wir unser Aufräum-Skript starten, bevor die neue JVM-Instanz gestartet wird. Das jvm_restart Ereignis wird dafür benutzt.

Erstellen Sie bitte eine einfache Batch-Datei, so wie folgt und platzieren Sie sie in das gleiche Verzeichnis wie die Wrapper-Programmdatei. Dieses Beispiel simuliert auf einfache Weise einen Aufräum-Task von 10 Sekunden Dauer. Ein wirkliches Skript wäre noch interessanter.

Beispielskript: "cleanupTest.bat"
@echo off
echo Aufräumen für 10 Sekunden...
rem Benutzen Sie Ping, um eine Verzögerung von 10 Sekunden Dauer zu veranlassen.
PING 1.1.1.1 -n 1 -w 10000 >NUL
echo Aufräumen ist komplett erledigt.

Als nächsten Schritt fügen Sie bitte folgende Eigenschaften der wrapper.conf hinzu:

Konfigurationsdatei "wrapper.conf"
wrapper.event.jvm_restart.command.argv.1=cleanupTest.bat
wrapper.event.jvm_restart.command.block=TRUE
wrapper.event.jvm_restart.command.loglevel=INFO

Nun, sobald festgestellt wurde, dass etwas hängt, wird der Wrapper, die konfigurierte Batch-Datei ausführen und Zugriff auf diese verweigern, solange bis sie komplett ausgeführt wurde:

Beispiel eines Ausgabelogs
wrapper  | JVM appears hung: Timed out waiting for signal from JVM.
wrapper  | JVM did not exit on request, terminated
wrapper  | Event Command 'jvm_restart': Command line: cleanupTest.bat
wrapper  | Event Command 'jvm_restart': Command launched (pid: 1188), blocking for up to 15 seconds...
Cleaning up for 10 seconds...
All done cleaning up.
wrapper  | Event Command 'jvm_restart': Command completed with exit code: 0
wrapper  | Event Command 'jvm_restart': Command completed with exit code: 0  Continuing.
wrapper  | Launching a JVM...

Email-Benachrichtigung

Kompatibel :3.3.0
Editionen :Professional EditionStandard Edition (Not Supported)Community Edition (Not Supported)
Betriebssysteme :WindowsMac OSXLinuxIBM AIXFreeBSDHP-UXSolarisIBM z/OSIBM z/Linux

Zusätzlich zu der Fähigkeit, externe Befehle als Antwort auf Freeze-Ereignisse auszuführen, ist es auch möglich, den Wrapper für das Versenden von Benachrichtigungsemails zu konfigurieren. Die Email kann die Form einer einfachen Benachrichtigung haben oder optional auch die neueste Logausgabe als Anhang beinhalten.

Eine Email-Benachrichtigung des jvm_unexpected_exit Ereignisses kann wie folgt konfiguriert werden:

Konfigurationsdatei "wrapper.conf"
wrapper.event.default.email.smtp.host=mail.example.com
wrapper.event.default.email.sender=wrapper-app@example.com
wrapper.event.default.email.recipient=sysadmin@example.com
wrapper.event.jvm_killed.email=TRUE
wrapper.event.jvm_killed.email.subject=Oh no! The application was killed.
wrapper.event.jvm_killed.email.maillog=ATTACHMENT

Diese veranlasst eine Email wie die Folgende zu versenden, wann immer die JVM per kill-Befehl beendet wurde.

jvm_killed email
Subject: Oh nein! Die Anwendung wurde mit kill beendet.
To: sysadmin@example.com
From: wrapper-app@example.com

Java Service Wrapper Event Notification

Host: myserver
App Name: testwrapper
         TestWrapper Example Application

Ereignis: jvm_killed
--

STATUS | wrapper  | 2012/05/15 18:23:42 | ...
INFO   | jvm 1    | 2012/05/15 18:23:47 | WrapperManager: WARNING: Making JVM appear to be hung...
ERROR  | wrapper  | 2012/05/15 18:24:24 | JVM appears hung: Timed out waiting for signal from JVM.
ERROR  | wrapper  | 2012/05/15 18:24:25 | JVM did not exit on request, terminated

Aber es ist auch gut, gute Nachrichten zu bekommen. Die folgende Konfiguration teilt dem Wrapper mit, jedes Mal, wenn die JVM gestartet wurde und Ihre Anwendung wieder läuft, eine zweite Email zu versenden. Dieses Paar an Emails kann sehr nützlich sein, um Sie über den Zustand des Servers auf dem Laufenden zu halten, so dass Sie wissen, ob Sie sich bereits entspannen können.

Ihre wrapper.conf für die Konfiguration
wrapper.event.jvm_started.email=TRUE
wrapper.event.jvm_started.email.subject=Gute Nachricht! Die Anwendung läuft wieder.
wrapper.event.jvm_started.email.maillog=ATTACHMENT

Die Email- und Ereignissysteme des Wrappers sind sehr leistungsstark und konfigurierbar. Bitte sehen Sie bezüglich mehr Details auf der Seite der Ereignisübersicht.

Verweis: Absturz der Anwendung

Der Java Service Wrapper bietet einen kompletten Satz an Konfigurationseigenschaften an, die es Ihnen ermöglichen, dass der Wrapper genau Ihre Bedürfnisse abdeckt. Sehen Sie bitte in die Dokumentation bezüglich der einzelnen Eigenschaften, um alle Möglichkeiten über die obengenannten Beispiele hinaus zu sehen.