簡體   English   中英

將長期運行的服務集成到Spring啟動框架中

[英]Integrate a long running service into Spring boot framework

我已經實現了將永遠運行的kinesis流使用者,我想將其集成到spring框架中以進行監視和正常關閉。 但是我發現我無法通過http shutdown請求停止使用者。 更具體地說,只有Spring Web App停止了,而使用者沒有停止。 這是我所做的:

我為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!!");
    } 
}

在使用者類的入口處,我在startConsumer方法中添加了@EventListener(ApplicationReadyEvent.class)

@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 shutdown停止程序時,只有spring應用程序停止。 消費者仍在運行。

關於如何阻止消費者的任何想法? 或更籠統地說,如何將一個長期運行的流程集成到spring框架中? 我嘗試了非網絡選擇,但是這阻止了我使用http請求進行監視。

任何建議將不勝感激!!!

重要的一點是,在EventListener阻止執行是不正確的。 您應該從事件偵聽器方法啟動一個線程,該線程將為您處理。 因此,您需要在單獨的線程中調用Worker.run 或者,您可以將事件偵聽器標記為@Async

現在的問題是在Spring Boot應用程序停止時正確停止它。

為了能夠在春季對關閉事件做出反應,您可以在bean中實現SmartLifecycle

stop調用你需要停止的Worker 這個答案有一些不錯的選擇。

請確保您調用Runnable傳遞到stop時,工人關閉完成。 有關更多詳細信息,請參見SmartLifecycle.stop javadoc

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM