0

主要问题

我正在编写一个应用程序(可在 GitHub 上获得- 构建/运行说明如下),它会抓取日志文件并对写入日志的某些事件做出反应(在这种情况下,向 REST API 发出 HTTP 请求)。我选择了 Java、Spring Boot 2.x、Apache Tailer和OpenFeign作为实现这一目标的主要工具。

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

附加信息

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

  1. Tailer 初始化(我可以看到TailerListenerAdapter.init()TailerListenerAdapter我构建它时调用)

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

一旦我在日志中写了一些东西,我的 TailerListenerAdapter 知道它应该做出反应,它看起来就像控制从Tailer.run()方法调用中退出,并且应用程序退出(优雅地)。我希望它继续运行并跟踪日志,直到我停止应用程序。

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

构建/运行说明

  1. 克隆项目
  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 Boot 配置文件,其中包含指定测试日志文件路径的位置。在 IntelliJ 中,使用以下内容设置 Maven 运行配置Command Linespring-boot:run -Dspring-boot.run.arguments=--spring.profiles.active=local

4

1 回答 1

1

我现在很确定Tailer在 Spring Boot 应用程序中运行的正确方法是修改要实现的主类CommandLineRunner(如这篇漂亮的Mkyong 小文章中所述),然后Tailer从那里运行。我相信这是因为 Spring Boot 假设您正在编写一个 Web 应用程序,其中入口点是由 Tomcat 或其他东西处理的入站请求。如果您想更改入口点(例如,它不是 Web 应用程序),您将执行上述操作并从本质上覆盖默认行为。

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

我希望这对某人有帮助!

于 2020-05-30T16:23:11.680 回答