代码之家  ›  专栏  ›  技术社区  ›  Winston Chen

有可能在C服务下启动Windows服务的Java进程吗?

  •  1
  • Winston Chen  · 技术社区  · 15 年前

    我想用Java语言将Java程序封装到Windows服务中。 System.ServiceProcess.ServiceBase . 所以我想出了以下代码:

    /// <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中使用线程。如果没有,则会发生一个异常,抱怨服务由于什么都不做而终止。

    其次,服务可以顺利地连接到Windows。但是,服务在启动后短时间内终止。我查看了进程监视器,只有服务进程在这段时间内保持活动状态, 贾瓦 然而,这个过程从未出现。有人知道如何解决这个问题吗?

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

    2 回复  |  直到 15 年前
        1
  •  1
  •   mfeingold    15 年前

    Java进程没有出现并不意味着它没有启动。它本来可以立刻启动和关闭的。尝试重定向stdout/stderr以查看发生了什么。

    另外,startservice和stopservice方法中的proc变量都是局部变量。当它超出范围时,您的进程对象将被垃圾收集。我想知道这是否会导致Java进程死亡。

        2
  •  1
  •   Community CDub    8 年前

    我建议您改用开放源码解决方案。

    看到这个帖子 How to create a windows service from java app
    我建议你带着这个去 http://sourceforge.net/projects/yajsw/