Java e servizi Windows

Prima o poi capita la necessità di dover creare un’applicazione e dover renderla un servizio per sistemi Windows.

In questi casi o si decide di programmare (e compilare) in linguaggi della piattaforma Microsoft oppure, ad esempio nel mio caso, si rende necessario ricorrere ad altre soluzioni per poter utilizzare Java.

In rete si trovano molti wrapper per Java, ad esempio Java Service Wrapper di Tanuki Software, Launch4j, JSmooth, l’elenco e lungo e basta cercare “windows java wrapper”. Personalmente mi sono fermato su Procrun, demone distrubuito da Apache Commons.

Vediamo nel dettaglio come utilizzarlo.Come prima cosa è necessario scrivere il programma java in modo da permettere l’integrazione con Procrun. S’inizia con un main() semplicissimo:

package myProgram;

public class myProgram {

    public static void start(String[] args) {
        System.out.println("Starting service...");
        // Your code here...
    }

    public static void stop(String[] args) {
        System.out.println("Stopping service...");
        // Your code here...
        System.exit(0);
    }

    public static void main(String[] args) {
        if (args.length > 0) {
            switch (args[0]) {
                case "start":
                    start(args);
                    break;
                case "stop":
                    stop(args);
                    break;
            }
        } else {
            System.out.println("Usage: java -jar myProgram.jar start|stop");
        }
    }
}

I metodi start() e stop() vengono invocati dal wrapper per avviare e fermare il servizio, sono comunque modificabili dal file di configurazione che vediamo qui:

set SERVICE_NAME=MyService
set PR_INSTALL=C:\YOURPATH\prunsrv.exe
set PR_JVM_32=C:\Program Files (X86)\Java\jre7\bin\client\jvm.dll
set PR_JVM_64=C:\Program Files\Java\jre7\bin\client\jvm.dll
 
REM Service log configuration
set PR_LOGPREFIX=%SERVICE_NAME%
set PR_LOGPATH=c:\YOURPATH\
set PR_STDOUTPUT=c:\YOURPATH\stdout.txt
set PR_STDERROR=c:\YOURPATH\stderr.txt
set PR_LOGLEVEL=Error
 
REM Path to java installation (depends on 32 or 64 bit)
if exist %PR_JVM_32% goto java32 
:java32 
set PR_JVM=%PR_JVM_32%
if exist %PR_JVM_64% goto java64
:java64 
set PR_JVM=%PR_JVM_64%
set PR_CLASSPATH=transactionCaller_SCHEDULER.jar
 
REM Startup configuration
set PR_STARTUP=auto
set PR_STARTMODE=jvm
set PR_STARTCLASS=myProgram.myPackage
set PR_STARTMETHOD=start
 
REM Shutdown configuration
set PR_STOPMODE=jvm
set PR_STOPCLASS=myProgram.myPackage
set PR_STOPMETHOD=stop
 
REM JVM configuration
set PR_JVMMS=128
set PR_JVMMX=256
set PR_JVMSS=4000
 
REM Install service
prunsrv.exe //IS//%SERVICE_NAME%
sc.exe start %SERVICE_NAME%

A questo punto non rimane che lanciare la batch di installazione e incrociare le dita…

Leave a Reply

Your email address will not be published. Required fields are marked *