主要问题
我正在编写一个应用程序(可在 GitHub 上找到 - 下面的构建/运行说明(,该应用程序可以抓取日志文件并对写入日志的某些事件做出反应(在这种情况下,向 REST API 发出 HTTP 请求(。 我选择了Java,Spring Boot 2.x,Apache Tailer和OpenFeign作为实现这一目标的主要工具。
我怀疑我不明白Apache Tailer及其在后台的线程是如何工作的,或者如何在Spring Boot应用程序中正确利用它。 在 Spring Boot 应用程序的上下文中初始化和运行Tailer
的正确方法是什么?
附加信息
为了测试这一点,我在本地启动应用程序,并通过 shell 将文本行回显到给定的日志文件中。 在撰写本文(提交 1fed906(时,当我运行该应用程序时,似乎:
-
Tailer 初始化(我可以看到在我构建它的
TailerListenerAdapter
上调用了TailerListenerAdapter.init()
( -
Tailer 运行(我看到我写入它监视的日志文件的所有内容都传递给
TailerListenerAdapter.handle()
(。
一旦我向日志写入我的 TailerListenerAdapter 知道它应该做出反应的内容,它看起来就像控件从Tailer.run()
方法调用中退出,并且应用程序退出(优雅地(。 我希望它继续运行并跟踪日志,直到我停止应用程序。
在这种情况下,我真的不确定在哪里调用Tailer.run()
,所以我在我的自定义 Tailer 子类中将其放在@PostConstruct
方法中。我以前从未使用过@PostConstruct
,所以我不能 100% 确定我是否正确使用它,或者是否有更好的位置来放置它以确保run()
在启动时被调用,同时还允许我将我所有的配置文件/bean 驱动的选项注入其中。
构建/运行说明
- 克隆项目
-
在外壳中运行以下命令:
mvn spring-boot:run -Dspring-boot.run.arguments=--tailer.logFile=/path/to/any/test.log,--logging.level.com.github.ubunfu.mclogbot=DEBUG
或
在 IDE 中设置等效的运行配置。有一个应用程序本地.yml Spring Boot 配置文件,其中包含指定测试日志文件路径的位置。在 IntelliJ 中,在
Command Line
中设置具有以下内容的 Maven 运行配置spring-boot:run -Dspring-boot.run.arguments=--spring.profiles.active=local
:
我现在很确定,在 Spring Boot 应用程序中运行Tailer
的正确方法是修改主类以实现CommandLineRunner
(如这篇漂亮的小 Mkyong 文章中所述(,并从那里运行Tailer
。 我相信这是因为 Spring 引导假设您正在编写一个 Web 应用程序,其中入口点是由 Tomcat 或其他东西处理的入站请求。 如果要更改入口点(例如,它不是Web应用程序(,则可以执行上述操作,并基本上覆盖默认行为。
此外,我遇到了一个问题,即应用程序在读取本应导致 Feign 客户端进行 API 调用的行后会意外地正常停止。 事实证明,原因是 Feign 客户端抛出了我没有处理的RuntimeException
。 由于没有堆栈跟踪或任何东西,因此没有立即发现任何异常。 我怀疑这是因为泰勒在另一个线程中运行?我不太确定。 关键是 - 当你使用泰勒时要注意这一点!
我希望这对某人有所帮助!