Systemdienst erstellen Ein Systemdienst ist eine Java-Anwendung, die ohne Benutzerschnittstelle auskommt und in der Regel permanent läuft. Damit ein Systemdienst aus der GUI-Anwendung heraus überwacht und gestartet werden kann, gibt es ein paar einfache Regeln zu beachten. Ein Dienst sollte von der Klasse AbstractService erben, ... Als Beispiel gehört der Dienst SampleService zum Lieferumfang.
public class SampleService extends AbstractService {
private static final String APP_NAME = SampleService.class.getSimpleName();
private static final String[] ctxPaths = {
"de/schwarzrot/app/base/ctx/security-context.xml",
"de/schwarzrot/app/base/ctx/data-access-context.xml",
"de/schwarzrot/service/sample/ctx/application-context.xml" };
public static void main(String[] args) {
List sArgs = new ArrayList(Arrays.asList(args));
new ServiceLauncher(new SampleService(),
ctxPaths,
sArgs).start();
}
}
Der ServiceLauncher erledigt die ganze Konfiguration und Initialisierung und sorgt dafür, dass der Dienst auch weiterläuft, wenn er von einer Konsole gestartet wurde. Noch ein Wort zu den Kontextdateien (den *.xml Dateien): Die ersten beiden Dateien sind von SRJRCFrames und sorgen für den Datenzugriff etc. Diese Dateien sollten so verwendet werden wie sie sind. Die dritte Kontextdatei ist die Grundkonfiguration der Anwendung, die kann nach eigenen Vorstellungen angepasst werden. Die Hauptmethoden eines Systemdienstes sind
@Override
public void setupLate() {
sysInfo = ApplicationServiceProvider.getService(SysInfo.class);
}
@Override
public void run() {
Log logger = LogFactory.getLog(SampleService.class);
logger.warn("username ...: " + sysInfo.getUserName());
logger.warn("system .....: " + sysInfo.getOperatingSystem());
logger.warn("curdir .....: " + sysInfo.getStartupDirectory());
}
setupEarly - wird beim Start des Systemdienstes aufgerufen - als erstes nach dem der Dienst zum Daemon wurde. Die Implementierung ist optional, d.h. es existiert eine Adapter-Funktion.
setupLate - wird beim Start des Systemdienstes aufgerufen und zwar als letztes, bevor die Dienstschleife gestartet wird. Diese Funktion muss implementiert werden.
run - Das Arbeitspferd des Dienstes. Diese Funktion wird zyklisch aufgerufen, solange der Dienst läuft. Wenn beim Dienst längere Phasen der Inaktivität erwartet werden, kann die Methode
isIdle verwendet werden. Gibt diese "Ja", bzw. true zurück, legt sich der Dienst eine Weile schlafen. Die Zeitspanne kann in der Konfiguration des Dienstes (in der Datenbank) geändert werden. Wenn der Dienst sich selbstständig beenden soll, kann die Methode setShutdownRequested verwendet werden. Ein Systemdienst sollte nicht von Hand gestartet werden. Dies ist zwar möglich, auf Dauer aber eher nervend. Deshalb gibt es den SRServiceManager. Der SRServiceManager verwendet die Datenbank zur Verwaltung der Dienste. Die Javabean ServiceDefinition , bzw. die Datenbank-Tabelle services legt fest, welcher Dienst auf welchem Rechner läuft und wie die Umgebung für den Dienst aussehen soll. Ein Dienst kann auch als "autostart" gekennzeichnet werden, dann wird er sofort gestartet, wenn der Diensteverwalter anläuft.
|