Für Ihre Anwendung mag es erforderlich sein, geplante Aufgaben bzw. Aktionen zu bestimmten Zeiten oder in regelmäßigen Zeitabständen auszuführen. Zum Beispiel:


Hier sagen wir Ihnen, wie Sie all dies mit dem Java Service Wrapper tun können.

Lösung

Der Java Service Wrapper hat eine Möglichkeit, Tasks wie Neustarts, Shutdowns, Thread-Dumps, Custom-Events etc. in einer plattformübergreifenden Weise unter Nutzung der Timer-Funktion zeitlich festzulegen.

Timers werden innerhalb der Wrapper-Konfigurationsdatei festgelegt , machen es so möglich, dass zuverlässig alle solche anwendungsspezifischen Einstellungen eingeschlossen werden. Dies macht es einfach möglich, die Anwendung auf mehreren Servern einzusetzen und zu wissen, dass alles konsistent funktioniert.

Timers können auf bestimmte Zeit, Wochentage oder auf Zeiträume eingestellt werden, die von ein Mal pro Woche bis jede Sekunde groß sein können. Diese Flexibilität vereinfacht das Planen von Backups und Ausfallzeiten zu Zeiten mit den geringsten Auswirkungen für Nutzer. Es erlaubt auch Ihren Systemadministratoren, Überstunden zu reduzieren, indem zu normalen Arbeitszeiten gearbeitet wird.

Technische Übersicht

Der Wrapper erlaubt Ihnen, mehrfache Timer zu definieren, jeden unter Nutzung von ein paar Eigenschaften. Die erste Eigenschaft, wrapper.timer.<n>.interval wird benutzt, um zu bestimmen, wann der Timer gestartet werden soll. Die zweite Eigenschaft, wrapper.timer.<n>.action wird benutzt, um zu bestimmen, welche Aktion oder Aktionen stattfinden sollen.

Eigenschaft: wrapper.timer.<n>.interval

Die Eigenschaft wrapper.timer.<n>.interval kann genutzt werden, um die Aktion zu bestimmten Zeiten oder Zeitintervallen zu starten. Wildcards können benutzt werden, um bestimmte Zeitintervalle zu definieren. Hier wie folgt ein paar Beispiele, aber lesen Sie bitte auch die vollständige Dokumentation der Eigenschaften, um zu sehen, was möglich ist.

Konfigurationsbeispiel: Jeden Tag um 03:55 in der Nacht
wrapper.timer.1.interval=hour=3; minute=55
Konfigurationsbeispiel: Jeden Montag um 03:55 in der Nacht
wrapper.timer.1.interval=day-of-week=2; hour=3; minute=55
Konfigurationsbeispiel: Alle 5 Sekunden
wrapper.timer.1.interval=second=*/5

Eigenschaft: wrapper.timer.<n>.action

Die Eigenschaft wrapper.timer.<n>.action wird benutzt, um die Aktion zu bestimmen, oder was passiert, wenn der Timer gestartet wurde. In den meisten Fällen ist dies eine einzelne Aktion, aber mehrere Aktionen können durch ein Komma getrennt werden, um jede dieser in Reihenfolge auszuführen. Wie folgt, sind ein paar Beispiele. Aber bitte lesen Sie die vollständige Dokumentation zu den Eigenschaften, um herauszufinden, was alles möglich ist.

Konfigurationsbeispiel: Einen Thread-Dump erstellen
wrapper.timer.1.action=dump
Konfigurationsbeispiel: Einen Thread-Dump erstellen und dann die JVM neu starten
wrapper.timer.1.action=dump, restart

Setzen von mehrfachen Timer:

Wenn Sie mehrfache Timer deklarieren möchten, fügen Sie einfach zusätzliche Eigenschaften mit eindeutigen Zahlen anstelle der obengenannten 1 hinzu.

Konfigurationsbeispiel: Mehrfache Timer, die Thread-Dumps jeden Tag um 03:55, 12:55 und 21:55 erzeugen
wrapper.timer.1.interval=hour=3; minute=55
wrapper.timer.1.action=dump
wrapper.timer.2.interval=hour=12; minute=55
wrapper.timer.2.action=dump
wrapper.timer.3.interval=hour=21; minute=55
wrapper.timer.3.action=dump

Wir werden nun ein paar interessante Einsatzzwecke des Timers mit Ihren Anwendungen behandeln.

Neustarts

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

Einer der am weitesten verbreiteten Timer-Aktionen sind planmäßige Neustarts der JVM. Neustarts sind häufig notwendig während Ausfallzeiten, um Workarounds für Speicher- und Ressourcenlecks zu haben, um mit externen Datenbanken neu zu synchronisieren, oder einfach um die Wrapper-Konfiguration neu zu laden.

Wenn eine Anwendung ein bekanntes Speicherleck hat, muss ein Systemadministrator oft ein Workaround für das Problem erstellen bis das zugrundeliegende Leck durch die JVM, die Anwendung oder den Library-Anbieter behoben werden konnte. Auch wenn die Anwendung eine Inhouse-Lösung ist, kann es oft etwas Zeit für das Entwicklerteam beanspruchen, um das Problem zu lösen. In der Zwischenzeit, wenn ein Leck unbehandelt bleibt, wird die JVM oft während Spitzenlastzeiten Out-of-memory Fehler haben.

Eine Lösung, um solche Probleme zu vermeiden, ist die, den Wrapper präventiv so zu konfigurieren, dass er die JVM zu Zeiten, wenn nur ein Minimum an Nutzern anwesend sind, neu zu starten. Zum Beispiel Sonntags, um 3 Uhr nachts.

Konfigurationsbeispiel: Neustart jeden Sonntag um 3 Uhr nachts
wrapper.timer.1.interval=day-of-week=1; hour=3
wrapper.timer.1.action=restart
Beispiel Logausgabe:
wrapper  | 2012/06/10 03:00:00 | Timer #1.  Restarting JVM.
jvm 1    | 2012/06/10 03:00:01 | TestWrapper: stop(0)
jvm 2    | 2012/06/10 03:00:06 | WrapperManager: Initializing...
jvm 2    | 2012/06/10 03:00:06 | TestWrapper: Initializing...

Thread-Dumps

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

Manchmal kann es bei der Problemfehlerbeseitigung nützlich sein, in regelmäßigen Zeitabständen Thread-Dumps für spätere Problemanalyse zu erstellen. Der Wrapper kann z.B. in 5-Minuten-Zeitabständen so auf einfache Weise tun.

Konfigurationsbeispiel: Anforderung von Thread-Dumps alle 5 Minuten
wrapper.timer.1.interval=minute=*/5
wrapper.timer.1.action=dump

WARNING

Wenn Sie das so versuchen, stellen Sie bitte sicher, dass die Größe der Logdatei groß genug ist, um die Dumps aufzunehmen.

Pausen und Wiederaufnahme

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

Wenn Sie Ihre Anwendung so konfiguriert haben, dass diese Pausen einlegen kann, dann ist es möglich, Timer für das Anhalten und Fortsetzen der Anwendung zu bestimmten Zeiten zu benutzen. Wenn eine Anwendung angehalten wird, kann der Wrapper so konfiguriert werdeb, die JVM anzuhalten, aber den Wrapper laufen zu lassen. Dies ist ideal um Auszeiten einzuplanen, die genutzt werden können, um Datenbank-Backups zu erstellen oder für andere Aufgaben, die nicht stattfinden können während die Anwendung läuft.

Die folgende Beispielkonfiguration zeigt, wie die JVM jede Nacht um 03:00 nachts gestoppt und dann um 04:00 nachts fortgesetzt wird.

Konfigurationsbeispiel: Geplante Pausen und Wiederaufnahme
wrapper.timer.1.interval=hour=3
wrapper.timer.1.action=pause
wrapper.timer.2.interval=hour=4
wrapper.timer.2.action=resume

Dies ist großartig, aber die Anwendung wird stets für 1 Stunde offline sein. Was ist, wenn wir die Anwendung fortsetzen wollen, sobald die notwendigen Backups gelaufen sind?

Dies kann durch Nutzung der wrapper.commandfile Eigenschaft zusammen mit dem RESUME-Befehl, der am Ende Ihres Backup-Skripts ausgegeben wird, getan werden. Die zeitlich festgelegte Wiederaufnahme sollte dennoch für alle Fälle eingestellt werden, z.B. wenn es ein Problem bei der Skriptabarbeitung gäbe. Die Fortsetzen-Aktion des Timers wird ignoriert, wenn sich die Anwendung nicht länger im Pausenmodus befindet.

Java-Tasks

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

Ein anderer Nutzen der RESUME-Timer-Aktion ist es, kurzlebige Java-Anwendungen, die eine geplante Aufgabe ausführen müssen, zu starten, bevor sie sich beenden. Durch die Kombination einer RESUME-Timer Aktion mit einerwrapper.on_exit.<n> Eigenschaftendefinition, kann dem Wrapper gesagt werden, in einen angehaltenen Zustand zu wechseln, jedes Mal, wenn die JVM sich beendet und dann diese neu zu starten, wenn der Timer gestartet wurde.

Zum Beispiel wir die folgende Konfiguration nicht eine JVM starten, wenn der Wrapper zuerst gestartet wurde. Vielmehr wartet diese und startet dann die JVM in 1-Stunden-Zeitabständen, zu Beginn jeder Stunde. Die Anwendung wird ein paar Aufgaben ausführen und sich dann beenden. Wenn es dies tut, wird der Wrapper eher in einen angehaltenen Zustand gehen als sich zu beenden oder eine JVM neu zu starten. Dieser Prozess wiederholt sich dann jede Stunde bis der Wrapper heruntergefahren wird.

Konfigurationsbeispiel: Geplante Zeiten der Pause und Wiederaufnahme
wrapper.pausable=TRUE
wrapper.pause_on_startup=TRUE
wrapper.timer.1.interval=minute=60
wrapper.timer.1.action=resume
wrapper.on_exit.default=PAUSE

Der Vorteil der Ausführung der Java-Anwendung dann wenn sie benötigt wird statt die JVM im Leerlauf zu halten, ist, dass Sie viel an Systemressoucen einsparen können, indem Sie den JVM-Prozess herunterfahren können, wenn dieser Prozess nicht benötigt wird.

Nutzerdefinierte Aktionen

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

Der Wrapper macht es auch möglich, die Ausführung von externen Befehlen zu terminieren oder Emails in regelmäßigen Zeitabständen zu versenden. Dies wird unter Nutzung von benutzerdefinierten Aktionsereignissen getan.

Das folgende Beispiel führt alle 10 Minuten ein Aufräumen -Skript oder -Batchdatei aus.

Konfigurationsbeispiel: Planmäßiges Ausführen von Befehlen für das Aufräumen
wrapper.event.user_100.command.argv.1=cleanup
wrapper.timer.1.interval=minute=*/10
wrapper.timer.1.action=user_100

Bitte sehen Sie auf der Seite der Ereignis-Übersichtfür mehr Informationen bzw. wie Befehle konfiguriert oder Emails gesendet werden können.

Verweis: Eigenschaft-Konfigurationen

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.