Hello everybody,

I tried to update the prunsrv.exe (1.0.15) installed on my server (Windows 2012) to the latest version (1.2.0)
I simply replaced the exe with the newest version.
After replacing it I was no more able to start the service.
Windows deliver the message "1067: the process has unexpectedly been stopped"
The log-file contains only following messages:
[2019-08-30 14:43:49] [debug] ( prunsrv.c:1754) [20592] Apache Commons Daemon procrun log initialized. [2019-08-30 14:43:49] [info]  ( prunsrv.c:1758) [20592] Apache Commons Daemon procrun (1.2.0.0 32-bit) started. [2019-08-30 14:43:49] [info]  ( prunsrv.c:1668) [20592] Running Service 'Med2Unify_Swisscom'... [2019-08-30 14:43:49] [debug] ( prunsrv.c:1441) [22040] Inside ServiceMain... [2019-08-30 14:43:49] [debug] ( prunsrv.c:904 ) [22040] reportServiceStatusE: dwCurrentState = 2, dwWin32ExitCode = 0, dwWaitHint = 3000, dwServiceSpecificExitCode = 0.
[2019-08-30 14:43:49] [info]  ( prunsrv.c:1196) [22040] Starting service...

If I replace back the prunsrv.exe with the oldest version (1.0.15). It works fine.
I use AdoptOpenJDK (Hotspot) JRE 11

This is the command Line I used to install the service:
prunsrv.exe^
 //US//ServiceEngine^
 --Startup=manual^
 --DisplayName="ServiceEngine"^
 --Classpath=ServiceEngine.jar^
 --Jvm="C:\Program Files (x86)\jdk-11.0.4+11-jre\bin\client\jvm.dll"^
 --StartMode jvm^
 --StartClass ch.novcom.ServiceEngine^
 --StartMethod windowsService^
 --StartParams start^
 --StopMode jvm^
 --StopClass ch.novcom.ServiceEngine^
 --StopMethod windowsService^
 --StopParams stop^
 --LogPath "%CD%\log"^
 --LogPrefix ServiceEngine_
 --LogLevel Debug


And below the Java source code of the object that contains the Daemon part:
public class ServiceEngine implements Daemon {
    private final static Logger LOGGER = Logger.getLogger(ServiceEngine.class.getName());

    private static TheEngine myEngine = null;
    private static ServiceEngine m2uInstance = new ServiceEngine();

    /**
     * The Java entry point.
     *
     * @param args
     *            Command line arguments, all ignored.
     */
    public static void main(String[] args) {
        LOGGER.entering("ServiceEngine", "main");
        // the main routine is only here so I can also run the app from the
        // command line

        m2uInstance.initialize();

        Scanner sc = new Scanner(System.in);
        //wait until receive stop command from keyboard
        System.out.printf("Enter 'stop' to halt: ");
        while(!sc.nextLine().toLowerCase().equals("stop") && myEngine!=null && myEngine.isAlive());

        if (myEngine!=null && myEngine.isAlive()) {
            m2uInstance.terminate();
        }
        sc.close();
        LOGGER.exiting("ServiceEngine", "main");
    }

    /**
     * Static methods called by prunsrv to start/stop the Windows service. Pass      * the argument "start" to start the service, and pass "stop" to stop the
     * service.
     *
     * Taken lock, stock and barrel from Christopher Pierce's blog at
     * http://blog.platinumsolutions.com/node/234
     *
     * @param args
     *            Arguments from prunsrv command line
     **/
    public static void windowsService(String args[]) {
        String cmd = "start";
        if (args.length > 0) {
            cmd = args[0];
        }

        if ("start".equals(cmd)) {
            m2uInstance.windowsStart();
        } else {
            m2uInstance.windowsStop();
        }
    }

    public void windowsStart() {
        LOGGER.entering(getClass().getName(), "windowsStart");

        initialize();
        if (myEngine != null){
            while (myEngine.isAlive()) {
                // don't return until stopped
                synchronized (this) {
                    try {
                        this.wait(5000); // wait 5s and check if stopped
                    } catch (InterruptedException ie) {
                    }
                }
            }
        }

        LOGGER.exiting(getClass().getName(), "windowsStart");
    }

    public void windowsStop() {
        LOGGER.entering(getClass().getName(), "windowsStop");
        terminate();
        synchronized (this) {
            // stop the start loop
            this.notify();
        }
        LOGGER.exiting(getClass().getName(), "windowsStop");
    }

    // Implementing the Daemon interface is not required for Windows but is for
    // Linux
    @Override
    public void init(DaemonContext arg0) throws Exception {
        LOGGER.entering(getClass().getName(), "init");

        LOGGER.exiting(getClass().getName(), "init");
    }

    @Override
    public void start() {
        LOGGER.entering(getClass().getName(), "start");
        initialize();
        LOGGER.exiting(getClass().getName(), "start");
    }

    @Override
    public void stop() {
        LOGGER.entering(getClass().getName(), "stop");
        terminate();
        LOGGER.exiting(getClass().getName(), "stop");
    }

    @Override
    public void destroy() {
        LOGGER.entering(getClass().getName(), "destroy");
        LOGGER.exiting(getClass().getName(), "destroy");
    }

    /**
     * Do the work of starting the engine
     */
    private void initialize() {
        LOGGER.entering(getClass().getName(), "initialize");
        if (myEngine == null) {
LOGGER.logp(Level.INFO,getClass().getName(),"initialize","Starting the Engine");
            myEngine = new TheEngine();
            if (myEngine.initialize()){
                myEngine.start();
            }
            else {
LOGGER.logp(Level.SEVERE,getClass().getName(),"initialize","The Engine has not been successfully initialized.");
                myEngine = null;
            }
        }
        LOGGER.exiting(getClass().getName(), "initialize");
    }

    /**
     * Cleanly stop the engine.
     */
    public void terminate() {
        LOGGER.entering(getClass().getName(), "terminate");
        if (myEngine != null) {
LOGGER.logp(Level.INFO,getClass().getName(),"terminate","Stopping the Engine");
            myEngine.terminate();
LOGGER.logp(Level.INFO,getClass().getName(),"terminate","Engine stopped");
        }
        LOGGER.exiting(getClass().getName(), "terminate");
    }

}



---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscr...@commons.apache.org
For additional commands, e-mail: user-h...@commons.apache.org

Reply via email to