Java 将长时间运行的服务集成到Spring引导框架中
我已经实现了一个将永远运行的kinesis流消费者,我想将其集成到spring框架中,以便进行监视和关闭。但是我发现我无法通过http关闭请求阻止消费者。更具体地说,只有SpringWeb应用程序被停止,而不是消费者。以下是我所做的: 我为spring创建了一个主类,如下所示:Java 将长时间运行的服务集成到Spring引导框架中,java,spring,spring-boot,Java,Spring,Spring Boot,我已经实现了一个将永远运行的kinesis流消费者,我想将其集成到spring框架中,以便进行监视和关闭。但是我发现我无法通过http关闭请求阻止消费者。更具体地说,只有SpringWeb应用程序被停止,而不是消费者。以下是我所做的: 我为spring创建了一个主类,如下所示: @SpringBootApplication public class Application { public static void main(String[] args) { Spring
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication application = new SpringApplication(Application.class);
application.addListeners(new ApplicationPidFileWriter("./app.pid"));
application.run(args);
System.out.println("I'm Here!!");
}
}
在consumer类的入口,我将@EventListener(ApplicationReadyEvent.class)
添加到startConsumer
方法中
@EventListener(ApplicationReadyEvent.class)
public static void startConsumer() throws Exception {
init();
...
int exitCode = 0;
try {
worker.run(); // will run forever
} catch (Throwable t) {
System.err.println("Caught throwable while processing data.");
t.printStackTrace();
exitCode = 1;
}
System.exit(exitCode);
}
消费者在mvn-package&&java-jar myJar
之后成功启动,但是当我使用http关机停止程序时,只有spring应用程序停止。消费者仍在运行
你知道如何阻止消费者吗?或者更一般地说,如何将长时间运行的流程集成到spring框架中?我尝试过非web选择,但这使我无法使用http请求进行监视
任何建议都将不胜感激 重要的一点是,在
EventListener
中阻止执行是不正确的。您应该从事件侦听器方法启动一个线程,该线程将为您进行处理。因此,您需要在单独的线程中调用Worker.run
。或者,您可以将事件侦听器标记为@Async
现在的问题是在spring引导应用程序停止时正确停止它
为了能够对spring中的关闭事件做出反应,您可以在bean中实现
调用stop
时,您需要停止工作程序。这有一些很好的选择如何做到这一点
确保在工作人员关闭完成时调用传递给stop
的Runnable
。有关更多详细信息,请参见SmartLifecycle.stop
如何实施工作程序
?run
是阻塞呼叫吗?@Roman Konova是的,我想是的。我正在使用Kinesis客户端库。当我只运行consumer时,在我ctrl+c
之前我无法执行任何操作,因此我认为这是一个阻塞调用。这里是KCL链接,如果有帮助,谢谢你的回答!我有一些关于它的问题。1.要从事件侦听器启动新线程,我可以直接在该EventListener
上使用@Async
关键字吗?2.您能否解释一下有关的更多信息,确保在工人关闭完成时调用传递给stop的Runnable命令。
?谢谢<可以使用code>@Async
。关于停止,请看链接的答案。有一种方法可以等到工人停下来。之后,您需要调用传递给stop的回调(请参阅该方法的javadoc)。