spring启动应用程序作为守护程序服务?

5t7ly7z5  于 2021-06-07  发布在  Kafka
关注(0)|答案(1)|浏览(568)

我是一个刚开始学习春靴的人。我觉得这是一个非常有用的工具,可以很容易地开发java应用程序。
另一方面,我正在考虑开发一个守护程序服务,它通过kafka使用者api从apachekafka收集数据/消息,并对检索到的数据进行一些处理。当然,整个过程都是周期性的。
所以我一直在使用apachecommons守护程序作为守护程序开发应用程序。不过,我现在想用SpringBoot来代替它。
有没有可能通过springboot实现这样的服务应用程序?如果可能的话,请告诉我如何实施。提前谢谢!

tv6aics1

tv6aics11#

我在某个地方发现了这个,向最初的所有者表示歉意,但我创建了一个添加了spring引导加载程序依赖项的项目

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-loader</artifactId>
    <scope>provided</scope>
</dependency>

因为需要扩展jarlauncher类。springboot提供了一个特殊的启动程序来更改java行为类装入器。类org.springframework.boot.loader.jarlauncher创建一个特殊的类装入器并引导应用程序。
因为我想将应用程序作为窗口服务启动,所以我选择procrun作为服务管理器。procrun需要两个start和stop方法或一个带有字符串数组参数的方法(有关详细信息,请参阅procrun项目)。因此,我创建了一个bootsrap类来扩展jarlauncher并实现procrun需要的方法。

public class Bootstrap extends JarLauncher {

private static ClassLoader classLoader = null;
private static Bootstrap bootstrap = null;

protected void launch(String[] args, String mainClass, ClassLoader classLoader, boolean wait)
        throws Exception {
    Runnable runner = createMainMethodRunner(mainClass, args, classLoader);
    Thread runnerThread = new Thread(runner);
    runnerThread.setContextClassLoader(classLoader);
    runnerThread.setName(Thread.currentThread().getName());
    runnerThread.start();
    if (wait == true) {
        runnerThread.join();
    }
}

public static void start (String []args) {
    bootstrap = new Bootstrap ();
    try {
        JarFile.registerUrlProtocolHandler();
        classLoader = bootstrap.createClassLoader(bootstrap.getClassPathArchives());
        bootstrap.launch(args, bootstrap.getMainClass(), classLoader, true);
    }
    catch (Exception ex) {
        ex.printStackTrace();
        System.exit(1);
    }
}

public static void stop (String []args) {
    try {
        if (bootstrap != null) {
            bootstrap.launch(args, bootstrap.getMainClass(), classLoader, true);
            bootstrap = null;
            classLoader = null;
        }
    }
    catch (Exception ex) {
        ex.printStackTrace();
        System.exit(1);
    }
}

public static void main(String[] args) {
    String mode = args != null && args.length > 0 ? args[0] : null;
    if ("start".equals(mode)) {
        Bootstrap.start(args);
    }
    else if ("stop".equals(mode)) {
        Bootstrap.stop(args);
    }
}
}

在spring boot应用程序类中,我将main方法更改为:

private static ApplicationContext applicationContext = null;

public static void main(String[] args) {
    String mode = args != null && args.length > 0 ? args[0] : null;

    if (logger.isDebugEnabled()) {
        logger.debug("PID:" + ManagementFactory.getRuntimeMXBean().getName() + 
                     " Application mode:" + mode + " context:" + applicationContext);
    }
    if (applicationContext != null && mode != null && "stop".equals(mode)) {
        System.exit(SpringApplication.exit(applicationContext, new ExitCodeGenerator() {
            @Override
            public int getExitCode() {
                return 0;
            }
        }));
    }
    else {
        SpringApplication app = new SpringApplication(TestProcrunApplication.class);
        applicationContext = app.run(args);
        if (logger.isDebugEnabled()) {
            logger.debug("PID:" + ManagementFactory.getRuntimeMXBean().getName() + 
                         " Application started context:" + applicationContext);
        }
    }
}

然后,我安装了 prunsrv.exe :
prunsrv.exe//is//test procrun--displayname=“test procrun”---description=“test procrun”---startup=auto--install=%cd%\prunsrv.exe--jvm=auto--classpath=%cd%..\target\test-procrun-0.0.1-snapshot.jar--startmode=jvm--startclass=it.test.procrun.bootstrap--startmethod=start--startparms=start--stopmode jvm--stopclass=it.test.procr--stopmethod=stop--stopparams=stop--stdoutput=auto--stderror=auto--logpath=%cd%--loglevel=debug

相关问题