是否可以使用C#启动Windows服务下的java进程?

时间:2010-05-21 11:26:18

标签: c# java windows-services process

我想使用System.ServiceProcess.ServiceBase将一个java程序包装到一个带有C#的Windows服务中。所以我想出了以下代码:

/// <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();
}

首先,我必须在OnStart和OnStop中使用Threads。如果不是,则会发生异常,抱怨服务因无所事事而终止。

其次,服务可以顺利连接到窗口。但是,服务在启动后会短时间终止。我查看了进程监视器,只有服务进程保持活动状态,而 javaw 进程从未显示过。有没有人知道如何解决这个问题?

它在普通的控制台环境中工作正常。我认为它与Windows服务有关。

2 个答案:

答案 0 :(得分:1)

我建议您使用开源解决方案。

请参阅此帖How to create a windows service from java app
我建议使用这个http://sourceforge.net/projects/yajsw/

答案 1 :(得分:1)

Java进程没有显示并不意味着它没有启动。它可以立即启动和关闭。尝试重定向stdout / stderr以查看发生了什么。

StartService和stopservice方法中的proc变量也是局部变量。当它超出范围时,您的过程对象将被垃圾回收。我想知道这是否会导致你的java进程死亡