如何在 Spring 启动应用程序中使用 Apache Tailer?

How do I use Apache Tailer within a Spring Boot App?

主要问题

我正在编写一个应用程序(available here on GitHub - build/run instructions below) that scrapes a log file and reacts to certain events written to the log (in this case, making an HTTP request to a REST API). I've chosen Java, Spring Boot 2.x, Apache Tailer and OpenFeign 作为实现该目的的主要工具。

我怀疑我不了解 Apache Tailer 及其线程在后台工作的方式,或者如何在 Spring 启动应用程序中正确利用它。在 Spring 引导应用程序的上下文中初始化和 运行 一个 Tailer 的正确方法是什么?

附加信息

为了对此进行测试,我在本地启动应用程序,并通过 shell 将文本行回显到给定的日志文件中。 在撰写本文时(提交 1fed906),当我 运行 应用程序时,它似乎是:

  1. Tailer 初始化(我可以看到 TailerListenerAdapter.init() 在我构造它的 TailerListenerAdapter 上被调用)

  2. Tailer 运行s(我看到我写入它监视的日志文件的所有内容都传递给 TailerListenerAdapter.handle())。

只要我向日志中写入一些我的 TailerListenerAdapter 知道它应该做出反应的内容,看起来控件就会从 Tailer.run() 方法调用中退出,并且应用程序会(优雅地)退出。不过,我希望它保持 运行ning 和跟踪日志,直到我停止该应用程序。

我不确定在这种情况下在哪里调用 Tailer.run(),所以我在自定义 Tailer 子类的 @PostConstruct 方法中使用了它。我以前从未使用过 @PostConstruct,所以我不能 100% 确定我是否正确使用它,或者是否有更好的地方放置它以确保 run() 在启动时被调用还允许我将我所有的配置文件/bean 驱动选项注入其中。

构建/运行 说明

  1. 克隆 project
  2. 运行 这在 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 article 中所述),以及 运行 从那里的 Tailer。我相信这是因为 Spring boot 假定您正在编写一个 Web 应用程序,其中入口点是由 Tomcat 或其他东西处理的入站请求。如果您想更改入口点(例如,它不是网络应用程序),您可以执行上述操作并实质上覆盖默认行为。

此外,我遇到了一个问题,即在读取本应导致 Feign 客户端进行 API 调用的行后,应用程序会意外停止。事实证明,这是因为 Feign 客户端抛出了我没有处理的 RuntimeException。由于没有堆栈跟踪或其他任何内容,因此无法立即看出是否发生了任何异常。我怀疑这是因为 Tailer 在另一个线程中 运行ning?我不太确定。重点是 - 使用 Tailer 时要注意这一点!

希望对大家有所帮助!