Как использовать Apache Tailer в приложении Spring Boot?

Главный вопрос

Я пишу приложение (доступно здесь, на GitHub - инструкции по сборке / запуску ниже), которое очищает файл журнала и реагирует на определенные события, записанные в журнал (в данном случае, отправляя HTTP-запрос к REST API). Я выбрал Java, Spring Boot 2.x, Apache Tailer и OpenFeign в качестве основных средств достижения этой цели.

Я подозреваю, что не понимаю, как работает Apache Tailer и потоки, которые он выполняет в фоновом режиме, или как правильно использовать его в приложении Spring Boot. Какой правильный способ инициализировать и запуститьTailer в контексте приложения Spring Boot?

Дополнительная информация

Чтобы проверить это, я запускаю приложение локально и повторяю строки текста в заданном файле журнала через оболочку. На момент написания (фиксация 1fed906), когда я запускаю приложение, кажется, что:

  1. Tailer инициализируется (я вижу TailerListenerAdapter.init() называется на TailerListenerAdapter Я построил это с помощью)

  2. Запускается Tailer (я вижу все, что я пишу в файл журнала, который он наблюдает, и передается в TailerListenerAdapter.handle()).

Как только я записываю в журнал что-то, на что мой TailerListenerAdapter знает, что он должен реагировать, похоже, что управление выходит из Tailer.run()вызов метода, и приложение завершит работу (изящно). Я хочу, чтобы он продолжал работать и отслеживать журнал, пока я не остановлю приложение.

Я не был уверен, куда звонить Tailer.run() в этом контексте, поэтому у меня это в @PostConstructв моем собственном подклассе Tailer. Я никогда не использовал@PostConstruct раньше, поэтому я не на 100% уверен, что использую его правильно, или есть ли лучшее место для его размещения, чтобы убедиться, что run() вызывается при запуске, а также позволяет мне вводить в него все мои параметры, управляемые файлом конфигурации / компонентом.

Инструкции по сборке / запуску

  1. Клонировать проект
  2. Запустите это в оболочке:mvn spring-boot:run -Dspring-boot.run.arguments=--tailer.logFile=/path/to/any/test.log,--logging.level.com.github.ubunfu.mclogbot=DEBUG

    ИЛИ

    Настройте эквивалентную конфигурацию запуска в своей среде IDE. Существует конфигурационный файл Spring Boot application-local.yml, в котором можно указать путь к файлу журнала тестирования. В IntelliJ настройте конфигурацию запуска Maven со следующим вCommand Line: spring-boot:run -Dspring-boot.run.arguments=--spring.profiles.active=local

1 ответ

Решение

Теперь я почти уверен, что правильный способ запустить Tailer в приложении Spring Boot заключается в изменении основного класса для реализации CommandLineRunner(как описано в этой милой небольшой статье о Mkyong) и запуститеTailerоттуда. Я считаю, что это связано с тем, что загрузка Spring предполагает, что вы пишете веб-приложение, в котором точка входа - это входящий запрос, который должен обрабатываться Tomcat или чем-то еще. Если вы хотите изменить точку входа (например, это не веб-приложение), вы должны сделать то же самое и существенно изменить поведение по умолчанию.

Я до сих пор не совсем понимаю странное поведение, когда в первый раз, когда я пишу сообщение журнала, приложение должно реагировать (а не просто игнорировать) Tailer, и приложение, кажется, изящно останавливается. Однако я считаю, что исправил это, поэтому поделюсь.

В этом приложении поведение "реакции" на конкретное сообщение журнала, о котором я все время говорю, следующее:

  1. Разбор сообщения журнала
  2. Создание HTTP-запроса
  3. Использование клиента Feign для отправки его в REST API

Раньше я игнорировал ответ клиента Feign - даже не назначал его Responseобъект. Когда я решил попробовать это, чтобы увидеть, что на самом деле возвращается из API, поведение приложения изменилось, так что оно больше не выходило само по себе после первого вызова. Я мог бы продолжать писать сообщения, и он продолжал бы попадать в API.

Вот ссылка на PR с изменением, которое, я уверен, исправлено.

Надеюсь, это поможет кому-то другому!

Другие вопросы по тегам