I would like to wrap a java program into a windows service with C# using System.ServiceProcess.ServiceBase. So I came up with the following code:
/// <summary>
/// The main entry point for the application.
/// </summary>
static void Main()
{
System.ServiceProcess.ServiceBase.Run(new JavaLauncher());
}
protected override void OnStart(string[] args)
{
Thread _thread;
_thread = new Thread(StartService);
_thread.Start();
base.OnStart(args);
}
protected override void OnStop()
{
Thread _thread;
_thread = new Thread(StopService);
_thread.Start();
base.OnStop();
}
static public void StartService()
{
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.EnableRaisingEvents = false;
proc.StartInfo.FileName = "javaw";
proc.StartInfo.Arguments = config.generateLaunchCommand();
proc.Start();
}
static public void StopService()
{
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.EnableRaisingEvents = false;
proc.StartInfo.FileName = "javaw";
proc.StartInfo.Arguments = "-jar stop.jar";
proc.Start();
}
Firstly I had to use Threads in OnStart and OnStop. If not, an exception occurs complaining that the service is terminated because of doing nothing.
Secondly, the service can be hooked up to windows smoothly. However, the service terminates a short while after it is started. I looked into the process monitor, only the service process stays alive for that short while, the javaw process never showed up, however. Is there anyone who knows how this can be fixed?
It works fine in an ordinary console environment. I think it has something to do with Windows service.
That the Java process does not show up does not mean it did not start. It could’ve started and shut down right away. Try redirecting the stdout/stderr to see what’s happening.
Also the proc variable Within both StartService and stopservice methods is a local variable. When it goes out of scope, your process object is garbage collected. I wonder if this causes your java process to die