无法在jvm模式下运行windows服务:错误1067

xxhby3vn  于 2021-07-11  发布在  Java
关注(0)|答案(0)|浏览(277)

我正在尝试使用apache公共守护进程创建windows服务,但我无法让它按预期的方式工作。
使用jvm模式,它总是返回错误1067,没有进一步的解释。以下是运行日志:

[2020-11-18 15:56:20] [info]  [11104] Apache Commons Daemon procrun (1.2.3.0 32-bit) started.
[2020-11-18 15:56:20] [info]  [11104] Running Service 'ServiceTest14'...
[2020-11-18 15:56:20] [info]  [14684] Starting service...

因为我需要rxtx,而且我没有找到一个可以工作的64位实现(这是另一个故事),所以我不得不使用32位jre:

C:\ServiceTest>java -version
java version "1.8.0_271"
Java(TM) SE Runtime Environment (build 1.8.0_271-b09)
Java HotSpot(TM) Client VM (build 25.271-b09, mixed mode, sharing)

所以我尝试了两个procrun版本:64位和32位。没有区别。在这两种情况下,windows事件记录器都会报告一个没有任何有用信息的崩溃,至少对我来说不是这样。

[2020-11-18 16:52:53] [info]  [20248] Apache Commons Daemon procrun (1.2.3.0 64-bit) started.
[2020-11-18 16:52:53] [info]  [20248] Running Service 'ServiceTest14'...
[2020-11-18 16:52:53] [info]  [20000] Starting service...

下面是prorun config/setup脚本:

set SERVICE_NAME=ServiceTest14
set SERVICE_PATH=C:\ServiceTest
set JAR=ServiceTest2.jar
set SERVICE_CLASS=it.stikez.servicetest2.ServiceTest2
set PR_INSTALL=%SERVICE_PATH%\prunsrv.exe
sc stop %SERVICE_NAME%
sc delete %SERVICE_NAME%

REM Service log configuration
set PR_LOGPREFIX=%SERVICE_NAME%
set PR_STDOUTPUT=%SERVICE_PATH%\logs\stdout.txt
set PR_STDERROR=%SERVICE_PATH%\logs\stderr.txt

REM Path to java installation
set PR_CLASSPATH=.;%SERVICE_PATH%\%JAR%;%SERVICE_PATH%\lib\*

REM JVM configuration
set PR_JVMMS=256
set PR_JVMMX=1024
REM Install service

%SERVICE_PATH%\prunsrv.exe //IS//%SERVICE_NAME% ^
    --Description="Test Service 7" ^
    --Install=%PR_INSTALL% ^
    --Startup=auto ^
    --Jvm="C:\Program Files (x86)\Java\jre1.8.0_271\bin\client\jvm.dll" ^
    --StartPath=%SERVICE_PATH% ^
    --StartMode=jvm ^
    --StartClass=%SERVICE_CLASS% ^
    --StartMethod=main ^
    --StartParams=start ^
    --StopPath=%SERVICE_PATH% ^
    --StopMode=jvm ^
    --StopClass=%SERVICE_CLASS% ^
    --StopMethod=main ^
    --StopParams=stop ^
    --LogPath=%SERVICE_PATH%\logs ^
    --LogLevel=Trace

将jvm值设置为auto或一些无意义的胡言乱语(比如随机字符)也没什么区别。但至少如果使用java模式(而不是jvm),它会启动。至少。停止动作不起作用;我认为它是在新的jvm会话中产生的,因为控制变量不受stop调用的影响。
下面是所使用的java代码示例(直接从apache站点获取,并做了一些修改,因为我不需要linux可移植性。

package it.stikez.servicetest2;

public class ServiceTest2 {

    private static ServiceTest2 engineLauncherInstance = new ServiceTest2();

    private static boolean stop = false;

    public static void main(String[] args) {
    String cmd = "start";
    if (args.length > 0) {
        cmd = args[0];

        System.out.println("Service called with param: " + cmd);
    }

    if ("start".equals(cmd)) {
        engineLauncherInstance.windowsStart();
    } else {
        engineLauncherInstance.windowsStop();
    }
    }

    public void windowsStart() {
    System.out.println("windowsStart called");
    initialize();
    while (!stop) {
        System.out.println("nloop stop=" + stop);
        // don't return until stopped
        synchronized (this) {
        try {
            this.wait(60000);  // wait 1 minute and check if stopped
        } catch (InterruptedException ie) {
            System.out.println("interrupted; stop=" + stop);
        }
        }
    }
    System.out.println("Service end");
    }

    public void windowsStop() {
    System.out.println("windowsStop called (stop=" + stop + ")");
    terminate();
    synchronized (this) {
        System.out.println("stop sync area");
        // stop the start loop
        this.notify();
    }
    System.out.println("stop call elaborated  (stop=" + stop + ")");
    }

    private void initialize() {
    }

    public void terminate() {
    stop = true;
    }
}

我正在(拼命地)寻找一种方法,让它在jvm模式下工作,或者在用户需要的时候使用任何其他魔术来正确地停止服务。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题