Pages

Between stimulus and response, there is a space. In that space lies our freedom and power to choose our response. In our response lies our growth and our happiness.

Monday, March 29, 2010

Java program into a Windows Service

If you google around, you will see there are a number of ways to do this. I tried the 2 easiest options that worked. In this article, I will talk about option 1 that uses the Apache Commons Daemon project (http://commons.apache.org/daemon/).

You can read up all about the Commons Daemon project in it's homepage. For us the important thing to know is we have to download "procrun". Procrun is actually an umbrella term for a set of libraries and applications. The applications we are concerned with are called "prunsrv" and "prunmgr".

The "prunsrv" application is the Windows Service binary. It is a native windows binary that runs as a windows service and starts up the JVM to run your Java. The "prunmgr" is a GUI application to start/stop and configure the service. It can also be run in the system tray where its icon will show the current state of the service like running or stopped.

Enough talk, lets start!

STEP 1:
Download the binaries (both tomcat6.exe and tomcat6w.exe) from here http://svn.apache.org/repos/asf/tomcat/tc6.0.x/trunk/res/procrun/
tomcat6.exe is prunsrv and tomcat6w.exe is prunmgr. Don’t ask about why they named the two files like that but lets change them after downloading. I am changing them to SomeService.exe and SomeServiceW.exe from tomcat6.exe and tomcat6w.exe respectively. The reason you want to do this is because when you run them the process explorer will list the processes as such

STEP 2:
You need to write a service class like the following. You need to have 3 methods at a minimum and they are main, start and stop. If you have some other methods you want to execute, you can call that to when you start the service. Procrun will run your start method in a thread, and monitor that thread for your method to return.



package com.yourbusiness.function.foo;

/**
* The service class that does the work for you
*/
public class SomeService {

/**
* Flag to know if this service
* instance has been stopped.
*/
private boolean stopped = false;

/**
* Single static instance of the service class
*/
private static SomeService serviceInstance = new SomeService ();

/**
* by default main method is called by prunsrv to start/stop
* the service. Pass the argument "start" to start the service,
* and pass "stop" to stop the service.
*/
public static void main(String args[]) {

String cmd = "start";
if(args.length > 0) {
cmd = args[0];
}

if("start".equals(cmd)) {
serviceInstance.start();
}
else {
serviceInstance.stop();
}
}


/**
* Start this service instance
*/
public void start() {

stopped = false;

System.out.println("SomeService Started " + new java.util.Date());

while(!stopped) {

synchronized(this) {
//do whatever you want to do here
System.out.println("SomeService is working");
}
}

System.out.println("SomeService Stopped " + new java.util.Date());
}

/**
* Stop this service instance
*/
public void stop() {
stopped = true;
synchronized(this) {
this.notify();
}
}

}

STEP 3:
I keep both of the exe files where I run the java class from. So, all of my related files are in one folder. I would execute the following to start my service



C:\SomeService\bin>SomeService.exe //IS//SomeService
--Install=C:\SomeService\bin\SomeService.exe
--Description="SomeService to do something"
--Jvm=auto
--Classpath=C:\SomeService\SomeService.jar
--StartMode=jvm
--StartClass=com.yourbusiness.function.foo.SomeService
--StartMethod=main
--StartParams=start
--StopMode=jvm
--StopClass=com.yourbusiness.function.foo.SomeService
--StopMethod=main
--StopParams=stop
--LogPath=C:\MyService\logs
--StdOutput=auto
--StdError=auto


For all the parameters, you can look at http://commons.apache.org/daemon/procrun.html and configure your service the way you want. I would put this in a bat file and call it addservice.bat

STEP 4:
Once service is added, you have to go to the Services panel and start the process. At that point you can have the service automatically or manually.

Some extra things, if you need.
If you make any mistake during the installation of the service, you can run the following to delete the service
SomeService.exe //DS//SomeService

0 comments:

Post a Comment