[英]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.