чтениеKafka
исходный код,читатьKafkaMessageListenerContainer
добрый,в методе входа doStart()
середина,Первая логическая область основана наisRunning()
Возвращаемое значение метода используется для определения того, продолжает ли метод работать.:
KafkaMessageListenerContainer#doStart:
protected void doStart() {
if (isRunning()) {
return;
}
if (this.clientIdSuffix == null) { // stand-alone container
checkTopics();
}
ContainerProperties containerProperties = getContainerProperties();
checkAckMode(containerProperties);
......
}
ЧтоisRunning()
Каков метод?,Прослеживая резервную копию, мы обнаруживаем, что этоSmartLifecycle
интерфейссерединаопределенныйметод,такKafkaMessageListenerContainer
добрыйвыполнитьполучил имя по имениSmartLifecycle
интерфейс。Если вы видели исходный код большинства фреймворков,ты найдешьSmartLifecycle
интерфейс Частота возникновения очень высока,что это такое,Какая польза? Давайте узнаем об этом больше вместе!
ОбъяснениеSmartLifecycle
интерфейсчас,Сначала объясниSmartLifecycle
интерфейсотецинтерфейсLifecycle
,Не волнуйся,Их функция одна и та же,ноSmartLifecycle
в детстведобрый Функция будет более мощной,ноLifecycle
интерфейсэто еще надо понять。
Lifecycle
интерфейс Это позволяет разработчикамсуществоватьвсеBeanПосле создания выполните некоторые индивидуальные задачи и запустите их.,И выполнить процесс уничтожения ресурса при выходе.
@PostConstruct
и@PreDestroy
две ноты,Они выполняют некоторые операции при инициализации или уничтожении компонента.,Эти операции относятся кBeanжизненный уровень цикла;Lifecycle
интерфейс Это решает другие сценарии,Например, мы хотим добавить жизненный в сам контейнер Поработайте над такими событиями, как запуск и остановка контейнера.Давайте сначала посмотрим на его определение:
public interface Lifecycle {
void start();
void stop();
boolean isRunning();
}
Lifecycle
интерфейсопределенныйтрииндивидуальныйметод:
имя метода | автор |
---|---|
start() | Вызывается после запуска контейнера |
stop() | Вызывается, когда контейнер остановлен |
isRunning() | Проверьте, запущен ли этот компонент |
когдаApplicationContext
полученныйstart
、stop
иrestart
В ожидании сигнала,Он будет вызван и реализованLifecycle
интерфейсизBeanсоответствующий метод。путем реализацииLifecycle
интерфейс,Мы можем получить обратный вызов контейнера жизненный цикл,Это дает возможность расширения бизнеса.
Давайте сделаем этоLifecycle
интерфейс,Давайте посмотрим на его конкретные практические эффекты:
@Component
public class MyLifecycle implements Lifecycle {
/**
* Текущий статус
*/
private volatile boolean running = false;
/**
* Вызывается после запуска контейнера
*/
@Override
public void start() {
System.out.println("После получения сигнала на запуск контейнера выполните операцию запуска MyLifecycle...");
running = true;
}
/**
* Вызывается, когда контейнер остановлен
*/
@Override
public void stop() {
System.out.println("После получения сигнала о закрытии контейнера выполните операцию остановки MyLifecycle...");
running = false;
}
/**
* Проверьте, запущен ли этот компонент。
* 1. Только когда этот метод возвращает false, метод start() будет выполнен после запуска контейнера.
* 2. Только когда этот метод возвращает true, метод остановка() будет выполняться только тогда, когда контейнер остановлен.
*/
@Override
public boolean isRunning() {
System.out.println("Проверьте Текущий компонент MyLifecycle статус:" + running);
return running;
}
}
Затем запустите проект SpringBoot, и вы обнаружите, что во время запуска соответствующие журналы не распечатываются, только когда приложение закрыто:
После получения сигнала о закрытии контейнера выполните операцию остановки MyLifecycle...
почему?существоватьSpringBoot
илиSpring
приложениесередина,Если вы просто реализуете интерфейс жизненного цикла без явного вызова метода start() класса AbstractApplicationContext,Тогда метод start() и метод isRunning() в интерфейсе жизненного цикла не будут выполнены.Однако,при выходе из приложения,ВыполнюisRunning()
метод определенияLifecycle
Оно началось?,если возвращает истину,будет вызванstop()
способы остановить。
Эта реализация требует от пользователя явного вызова контейнера.start()
иstop()
метод может быть запущенLifecycle
интерфейсизметодосуществлять,В общих проектах,Мы редко называем это явно так. Чтобы решить эту проблему,Spring
предоставилSmartLifecycle
интерфейс,Давайте начнем объяснять это ниже.
SmartLifecycle
унаследованныйLifecycle
интерфейс,И предоставляет более умные функции:
SmartLifecycle
интерфейсиз组件可以自动启动иостанавливаться;при запуске приложения,будет вызван автоматическивыполнить ПонятноSmartLifecycle
интерфейсиз组件изstart()
метод,без явного вызова контейнераstart()
метод。поэтому,Если вы хотите, чтобы жизненный циклический метод компонента выполнялся автоматически без явного вызова метода контейнера,Можно считатьвыполнитьSmartLifecycle
интерфейса не простовыполнитьLifecycle
интерфейс。
Давайте сначала взглянем на исходный код интерфейса SmartLifecycle:
public interface SmartLifecycle extends Lifecycle, Phased {
int DEFAULT_PHASE = Integer.MAX_VALUE;
default boolean isAutoStartup() {
return true;
}
default void stop(Runnable callback) {
stop();
callback.run();
}
@Override
default int getPhase() {
return DEFAULT_PHASE;
}
}
Это можно увидеть,SmartLifecycle
интерфейс除Понятно继承Lifecycle
интерфейсснаружи,также по наследствуPhased
интерфейс来获得控制осуществлять顺序из能力。Чтосередина,getPhase()
методотPhased
интерфейс,Определяется путем возврата значения этапаSmartLifecycle
Порядок выполнения компонентов。поэтому,путем реализацииSmartLifecycle
иPhased
интерфейс,Гибкое управление компонентамижизненный циклы Порядок выполнения.
Давайте сделаем этоSmartLifecycle
интерфейс,Давайте посмотрим на его конкретные практические эффекты:
@Component
public class MySmartLifecycle implements SmartLifecycle {
private volatile boolean running = false;
/**
* Если контекст, в котором находится класс Lifecycle, хочет иметь возможность автоматически выполнять обратные вызовы при вызове, верните true.
* Значение false указывает, что компонент предназначен для запуска с помощью явного вызова start(), аналогично обычной реализации жизненного цикла.
*/
@Override
public boolean isAutoStartup() {
return true;
}
/**
* Этот метод доступен только в подклассах SmartLifecycle. Этот метод будет вызываться только тогда, когда метод isRunning возвращает true.
*/
@Override
public void stop(Runnable callback) {
System.out.println("Контейнер MySmartLifecycle остановлен остановить (Runnable) метод Есть функция обратного звонка...");
// Вызов метода остановки без функции обратного вызова
stop();
// Если вы позволите isRunning вернуть true и выполнить метод остановки, не забудьте вызвать callback.run().
// В противном случае при выходе из программы Spring DefaultLifecycleProcessor посчитает, что MySmartLifecycle не был завершен с остановкой, и программа зависнет и не сможет быть завершена. Она автоматически завершится после ожидания в течение определенного периода времени (время ожидания по умолчанию равно 30). секунды).
callback.run();
}
/**
* 1. В основном в этом методе начать некоторые задачи или Запустите некоторые другие асинхронные службы, например включив MQ для получения сообщений.
* 2. Этот метод будет вызываться при обновлении контекста (после создания и инициализации всех объектов).
* по умолчаниюжизненный Процессор циклов проверит логическое значение, возвращаемое методом isAutoStartup() каждого объекта SmartLifecycle.
* Если «true», этот метод будет вызываться вместо ожидания явного вызова собственного метода start().
*/
@Override
public void start() {
System.out.println("Запуск контейнера MySmartLifecycle завершен метод start()...");
running = true;
}
/**
* Метод подкласса интерфейса Lifecycle. Этот метод будут выполнять только подклассы, не относящиеся к SmartLifecycle.
* 1. Этот метод работает только для классов, которые непосредственно реализуют интерфейс Lifecycle, и недействителен для классов, реализующих интерфейс SmartLifecycle.
* 2. Метод stop() и метод stop(Runnable обратный вызов) заключается в том, что последний является эксклюзивным для подкласса SmartLifecycle.
*/
@Override
public void stop() {
System.out.println("Контейнер MySmartLifecycle остановлен метод остановки() Нет функции обратного звонка...");
running = false;
}
/**
* 1. Метод start будет выполнен только в том случае, если этот метод вернет false.
* 2. Только когда этот метод вернет true, остановите (Runnable обратный вызов) метод будет выполнен.
*/
@Override
public boolean isRunning() {
System.out.println("MySmartLifecycle проверяет статус работы метод isRunning()...");
return running;
}
/**
* Если существует несколько классов, реализующих интерфейс SmartLifecycle,
* Тогда порядок выполнения методов start() этих классов основывается на возвращаемом значении метода getPhase() от малого к большому, например: сначала выполняются от 1 до 2, первым выполняются от -1 до 0.
* И такие методы Порядок выполнения остановки() — от большего к меньшему, в зависимости от возвращаемого значения метода getPhase(). Например: 2 выполняется первым, 1 выполняется позже, а 0 выполняется последним.
*/
@Override
public int getPhase() {
return 0;
}
}
Что касается функции каждого метода, комментарии были четко объяснены. Давайте запустим проект SpringBoot и распечатаем журнал следующим образом:
MySmartLifecycle проверяет статус работы методом isRunning()... Контейнер MySmartLifecycle запускается методом start()...
Закройте проект SpringBoot и распечатайте журнал следующим образом:
MySmartLifecycle проверяет статус работы методом isRunning()... Контейнер MySmartLifecycle останавливает метод stop(Runnable) с функцией обратного вызова... Контейнер MySmartLifecycle останавливает метод stop() без функции обратного вызова...
Основываясь на приведенных выше примерах, его можно резюмировать следующим образом:
SmartLifecycle
интерфейс,когдаSpring
容器启动час会自动осуществлять它из启动метод。существоватьосуществлять启动метод До,пройдетisRunning()
метод检查组件из Текущий статус,Если возвращаемое значениеfalse
Указывает, что операция запуска еще не выполнена.,В это время он будет называтьсяstart()
методначинать。Spring
когда контейнер закрыт,Компоненты проверю Текущий статус,И при необходимости выполните операции выключения. Если компонент запущен,Будет вызван соответствующий метод остановки. в то же время,Могут быть обработаны соответствующие функции обратного вызова.SmartLifecycle
интерфейссерединаизgetPhase()
метод返回из值越小,Чем выше приоритет,Указывает, что он будет выполняться первым во время процессов запуска и остановки.В этой статье мы впервые разберемся что такоеLifecycle
и Lifecycle
роль,По своим недостаткам,引出比它更强из子добрыйSmartLifecycle
。наспутем реализацииSmartLifecycle
интерфейс,Может более гибко контролировать запуск и остановку компонентов.,и определить порядок их выполнения。SmartLifecycle
Существует большое количество практических случаев его использования.,Таким образом, независимо от фактического боя или чтения исходного кода,Лучше знатьSmartLifecycle
Связанныйинтерфейс。
Если у вас есть какие-либо вопросы или вам нужна помощь по этой статье, оставьте сообщение в области комментариев, и я постараюсь ответить на него. Если эта статья была для вас полезна, пожалуйста, поставьте лайк в знак вашей поддержки, большое спасибо! 💗
Я участвую в специальном тренировочном лагере Tencent Technology Creation 2024 Пятый выпуск Объявлен конкурс сочинений, разделите приз со мной!