[英]How do I use Apache Tailer within a Spring Boot App?
我正在編寫一個應用程序( 在 GitHub 上可用- 下面的構建/運行說明),它會抓取日志文件並對寫入日志的某些事件做出反應(在這種情況下,向 Z50780F47F6839D047D60BC435E 發出 HTTP 請求)。 為此,我選擇了 Java、Spring Boot 2.x、 Apache Tailer和OpenFeign作為主要工具。
我懷疑我不了解 Apache Tailer 及其在后台執行的線程如何工作,或者如何在 Spring 引導應用程序中正確利用它。 在 Spring Boot 應用程序的上下文中初始化和運行Tailer
的正確方法是什么?
為了測試這一點,我在本地啟動應用程序,並通過 shell 將文本行回顯到給定的日志文件中。 在撰寫本文時(提交1fed906 ),當我運行該應用程序時,似乎:
Tailer 初始化(我可以看到TailerListenerAdapter.init()
在我構建的TailerListenerAdapter
上被調用)
Tailer 運行(我看到我寫到它監視的日志文件中的所有內容都傳遞給TailerListenerAdapter.handle()
)。
一旦我在日志中寫了一些東西,我的 TailerListenerAdapter 知道它應該做出反應,它看起來就像控制從Tailer.run()
方法調用中退出,並且應用程序退出(優雅地)。 我希望它繼續運行並跟蹤日志,直到我停止應用程序。
我不確定在這種情況下在哪里調用Tailer.run()
,所以我將它放在自定義 Tailer 子類的@PostConstruct
方法中。 我以前從未使用過@PostConstruct
,所以我不能 100% 確定我是否正確使用它,或者是否有更好的地方放置它以確保run()
在啟動時被調用,同時還允許我注入我所有的配置文件/ bean 驅動選項都放入其中。
Run this in a shell: mvn spring-boot:run -Dspring-boot.run.arguments=--tailer.logFile=/path/to/any/test.log,--logging.level.com.github.ubunfu.mclogbot=DEBUG
或者
在 IDE 中設置等效的運行配置。 有一個 application-local.yml Spring 引導配置文件,其中包含指定測試日志文件路徑的位置。 在 IntelliJ 中,在Command Line
中使用以下命令設置 Maven 運行配置: spring-boot:run -Dspring-boot.run.arguments=--spring.profiles.active=local
我現在很確定在 Spring 引導應用程序中運行Tailer
的正確方法是修改主 class 以實現CommandLineRunner
(如這篇漂亮的Mkyong 小文章中所述),然后從那里運行Tailer
。 我相信這是因為 Spring 啟動假定您正在編寫 web 應用程序,其中入口點是由 Tomcat 或其他東西處理的入站請求。 如果您想更改入口點(例如,它不是 web 應用程序),您將執行上述操作並基本上覆蓋默認行為。
此外,我遇到了一個問題,即應用程序在讀取應該導致 Feign 客戶端進行 API 調用的行后會意外停止。 事實證明,原因是 Feign 客戶端拋出了一個我沒有處理的RuntimeException
。 由於沒有堆棧跟蹤或任何東西,因此沒有立即明顯發生任何異常。 我懷疑這是因為 Tailer 在另一個線程中運行? 我不太確定。 重點是 - 當您使用 Tailer 時要注意這一點!
我希望這對某人有幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.