Как использовать Apache Tailer в приложении Spring Boot?
Главный вопрос
Я пишу приложение (доступно здесь, на GitHub - инструкции по сборке / запуску ниже), которое очищает файл журнала и реагирует на определенные события, записанные в журнал (в данном случае, отправляя HTTP-запрос к REST API). Я выбрал Java, Spring Boot 2.x, Apache Tailer и OpenFeign в качестве основных средств достижения этой цели.
Я подозреваю, что не понимаю, как работает Apache Tailer и потоки, которые он выполняет в фоновом режиме, или как правильно использовать его в приложении Spring Boot. Какой правильный способ инициализировать и запуститьTailer
в контексте приложения Spring Boot?
Дополнительная информация
Чтобы проверить это, я запускаю приложение локально и повторяю строки текста в заданном файле журнала через оболочку. На момент написания (фиксация 1fed906), когда я запускаю приложение, кажется, что:
Tailer инициализируется (я вижу
TailerListenerAdapter.init()
называется наTailerListenerAdapter
Я построил это с помощью)Запускается Tailer (я вижу все, что я пишу в файл журнала, который он наблюдает, и передается в
TailerListenerAdapter.handle()
).
Как только я записываю в журнал что-то, на что мой TailerListenerAdapter знает, что он должен реагировать, похоже, что управление выходит из Tailer.run()
вызов метода, и приложение завершит работу (изящно). Я хочу, чтобы он продолжал работать и отслеживать журнал, пока я не остановлю приложение.
Я не был уверен, куда звонить Tailer.run()
в этом контексте, поэтому у меня это в @PostConstruct
в моем собственном подклассе Tailer. Я никогда не использовал@PostConstruct
раньше, поэтому я не на 100% уверен, что использую его правильно, или есть ли лучшее место для его размещения, чтобы убедиться, что run()
вызывается при запуске, а также позволяет мне вводить в него все мои параметры, управляемые файлом конфигурации / компонентом.
Инструкции по сборке / запуску
- Клонировать проект
Запустите это в оболочке:
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, и приложение, кажется, изящно останавливается. Однако я считаю, что исправил это, поэтому поделюсь.
В этом приложении поведение "реакции" на конкретное сообщение журнала, о котором я все время говорю, следующее:
- Разбор сообщения журнала
- Создание HTTP-запроса
- Использование клиента Feign для отправки его в REST API
Раньше я игнорировал ответ клиента Feign - даже не назначал его Response
объект. Когда я решил попробовать это, чтобы увидеть, что на самом деле возвращается из API, поведение приложения изменилось, так что оно больше не выходило само по себе после первого вызова. Я мог бы продолжать писать сообщения, и он продолжал бы попадать в API.
Вот ссылка на PR с изменением, которое, я уверен, исправлено.
Надеюсь, это поможет кому-то другому!