我想使用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服务有关。
答案 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进程死亡