Как использовать Apache Tailer в приложении Spring Boot? - PullRequest
0 голосов
/ 25 мая 2020

Основной вопрос

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

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

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

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

  1. Tailer инициализируется (я вижу TailerListenerAdapter.init() вызывается на TailerListenerAdapter, с которым я его сконструировал)

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

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

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

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

  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 Ответ

0 голосов
/ 30 мая 2020

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

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

В этом приложении поведение для «реакции» на конкретное c сообщение журнала, на которое я все время ссылаюсь, выглядит следующим образом: *

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

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

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

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

...