我是一个刚开始学习Spring Boot的新手。我觉得它非常有用并且很容易开发Java应用程序。
另一方面,我正在考虑开发一个守护进程服务,它通过Kafka Consumer API从Apache Kafka收集数据/消息,并对检索到的数据进行一些处理。当然,这整个过程都是定期完成的。
所以我一直在使用Apache Commons Daemon开发应用程序作为守护进程。但是,我现在想要使用Spring Boot而不是它。
是否可以通过Spring Boot实现此类服务应用程序?如果可能,请告诉我如何实施。提前谢谢!
答案 0 :(得分:2)
我发现这个地方对原主人道歉但我创建了一个项目,我添加了spring-boot-loader依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-loader</artifactId>
<scope>provided</scope>
</dependency>
因为需要扩展JarLauncher类。 Spring启动提供了一个特殊的启动器,可以更改java行为类加载器。 org.springframework.boot.loader.JarLauncher类创建了一个特殊的类加载器并提升了应用程序。
由于我想将应用程序作为窗口服务启动,因此我选择Procrun作为服务管理器。 Procrun需要两个启动和停止方法或一个带字符串数组参数的方法(有关详细信息,请参阅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 =&#34; test-procrun&#34; --description =&#34;测试procrun&#34; --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 --StartParams = start --StopMode = jvm --StopClass = it.test.procrun.Bootstrap --StopMethod = stop --StopParams = stop --StdOutput = auto --StdError = auto --LogPath =%CD%--LogLevel = Debug