java服务包装器,非常基本的一步一步设置启动失败

时间:2012-05-21 20:10:49

标签: java java-service-wrapper

我简单地下载了JSW社区版,打开了一个目录:
c:\servicetest
所以这里有一个bin,conf,lib和log子目录等等。 从现在开始,这将是(根) 我将(root)/lib/wrapper.jar引用到我的ide(netbeans)并创建一个非常简单的服务(记住类名是Main):

public class Main extends WrapperSimpleApp {

public Main(String[] args) {
    super(args);
}

@Override
public void run() {

    while(true) {
        Logger.getLogger(Main.class.getName()).log(Level.INFO, "I'm alive");

        try 
           { Thread.sleep(2000); } 
        catch (InterruptedException ex) 
           { return; }
    }
}

}

如您所见,除了记录消息之外,它基本上什么都不做。但实际上它并没有开始。

我编译了项目(MyProject.jar),将jar复制到(root)目录并修改了(root)/config/wrapper.conf并添加:

wrapper.java.classpath.3=../MyProject.jar

wrapper.java.mainclass=textappender.Main

然后我在命令行中安装了服务,其中包含:

C:\servicetest\bin>wrapper -i ../conf/wrapper.conf

然后我通过services.msc控制面板或通过

启动了服务
C:\servicetest\bin>wrapper -t ../conf/wrapper.conf

在logs / wrapper.log中,我得到:

ERROR  | wrapper  | 2012/05/21 21:35:11 | JVM exited while loading the application.

更新1

根据Tanuki Software的建议,我已经设置了我的(root)/config/wrapper.conf(好了,因为它已经取消注释):

wrapper.debug=TRUE

现在我明白了:

INFO   | jvm 1    | 2012/05/22 10:46:37 | WrapperManager Debug: WrapperManager.stop(1) called by thread: main
INFO   | jvm 1    | 2012/05/22 10:46:37 | WrapperManager Debug: Backend not connected, not sending packet STOP : 1
INFO   | jvm 1    | 2012/05/22 10:46:37 | WrapperManager Debug: Stopped checking for  control events.
DEBUG  | wrapper  | 2012/05/22 10:46:37 | Pause reading child process output to share cycles.
INFO   | jvm 1    | 2012/05/22 10:46:37 | WrapperManager Debug: Thread, main, handling the shutdown process.
INFO   | jvm 1    | 2012/05/22 10:46:37 | WrapperManager Debug: shutdownJVM(1) Thread: main
INFO   | jvm 1    | 2012/05/22 10:46:38 | WrapperManager Debug: wait for 0 shutdown locks to be released.
INFO   | jvm 1    | 2012/05/22 10:46:38 | WrapperManager Debug: Backend not connected, not sending packet STOPPED : 1
INFO   | jvm 1    | 2012/05/22 10:46:38 | WrapperManager Debug: calling System.exit(1)
DEBUG  | wrapper  | 2012/05/22 10:46:38 | JVM process exited with a code of 1, setting the wrapper exit code to 1.

但鉴于我的实施非常简单,我无法猜出出了什么问题。

1 个答案:

答案 0 :(得分:2)

而不是扩展WrapperSimpleApp,您的主类应该实现org.tanukisoftware.wrapper.WrapperListener接口。

您可以在我们的网站上找到有关实施界面的详细说明: http://wrapper.tanukisoftware.com/doc/english/integrate-listener.html

如果您对conf文件中的实施和/或配置属性有任何疑问,请与我们联系。

另一个对我有用的建议是,不是立即将应用程序作为服务运行,而是通过先运行控制台应用程序来更容易地进行集成,因为您可以直接在控制台上看到输出。一旦一切正常,我继续安装/运行服务。 要作为控制台应用程序运行,您将运行例如:

C:\servicetest\bin>wrapper -c ../conf/wrapper.conf

您还可以通过设置

打开包装器的调试输出
wrapper.debug=true

在你的conf文件中。

由于评论而编辑:

如果您的应用程序实际上与您描述的一样简单,那么只需将您的应用程序编写为普通Java应用程序,而无需任何Wrapper API部件。

您可以使用WrapperSimpleApp在开箱即用的情况下运行您的应用程序,并将无代码集成到Wrapper中。

您需要做的就是在conf文件中设置以下属性:

wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp
wrapper.app.parameter.1=textappender.Main
wrapper.java.classpath.1=../lib/wrapper.jar
wrapper.java.classpath.2=../MyProject.jar

使用此配置,Wrapper将能够将您的应用程序作为Windows服务运行。

UPDATE2

我不确定你的代码究竟是什么样的,但是你似乎在主类中调用了WrapperManager.stop()......

在初始示例类之后,我修改了类,因此它没有使用任何Wrapper-API(对于简单的应用程序来说不是必需的):

public class Main {    
public static void main(String[] args) {
    while(true) {
        Logger.getLogger(Main.class.getName()).log(Level.INFO, "I'm alive");
        try 
        { Thread.sleep(2000); } 
        catch (java.lang.InterruptedException ex) 
        { return; }
    }
}
}

编译并创建jar后,conf文件中的必要属性为:

wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp
wrapper.app.parameter.1=textappender.Main
wrapper.java.classpath.1=../lib/wrapper.jar
wrapper.java.classpath.2=../MyProject.jar

欢呼声,