Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将长时间运行的服务集成到Spring引导框架中_Java_Spring_Spring Boot - Fatal编程技术网

Java 将长时间运行的服务集成到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

我已经实现了一个将永远运行的kinesis流消费者,我想将其集成到spring框架中,以便进行监视和关闭。但是我发现我无法通过http关闭请求阻止消费者。更具体地说,只有SpringWeb应用程序被停止,而不是消费者。以下是我所做的:

我为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)。