【问题标题】:java service wrapper, very basic step by step setup with startup failurejava服务包装器,非常基本的一步一步设置,启动失败
【发布时间】:2012-05-28 08:19:29
【问题描述】:

我只是下载了 JSW 社区版,解压到一个目录中:
c:\servicetest
所以在这里我有一个 bin、conf、lib 和 log 子目录等。 从现在开始,这将是 (root)。
我将 (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.

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

【问题讨论】:

    标签: java java-service-wrapper


    【解决方案1】:

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

    您可以在我们的网站上找到有关实现该接口的非常详细的说明: http://wrapper.tanukisoftware.com/doc/english/integrate-listener.html

    如果您对 conf 文件中的实现和/或配置属性有任何疑问,请告诉我。

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

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

    您也可以通过设置打开 Wrapper 的调试输出

    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 服务运行。

    更新2

    我不确定您的代码到底长什么样,但您似乎在主类中调用 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
    

    干杯,

    【讨论】:

    • 我的最后期限非常接近,所以要掌握从头开始实现接口所需的所有细节对我来说并不是一件容易的事。我的服务很简单,只需复制一个文本文件并提取一些内容,我认为我可以用简单的方法来完成。
    • 嗨,如果是这种情况,额外的编码可能是矫枉过正。我正在编辑解释无代码集成的原始答案。
    猜你喜欢
    • 2014-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-23
    相关资源
    最近更新 更多