springboot SmartLifeCycle 说明
Aplicación: realice operaciones personalizadas después de crear el contenedor Spring IOC y antes de que se cierre
******************************
Clases e interfaces relacionadas
Ciclo vital
public interface Lifecycle {
void start(); //容器启动后调用
void stop(); //容器关闭前调用
boolean isRunning(); //当前应用是否正在运行
}
SmartLifeCycle
public interface SmartLifecycle extends Lifecycle, Phased {
int DEFAULT_PHASE = 2147483647;
default boolean isAutoStartup() { //自动调用start()、stop()方法,默认自动调用
return true;
}
default void stop(Runnable callback) {
this.stop(); //调用stop()方法
callback.run(); //如果不调用该方法,等待30s关闭容器;如果调用了该方法,不需要等待就可关闭容器
}
default int getPhase() { //如果有多个继承了SmartLifeCycle接口的类,返回值小的start()方法先调用,stop()方法相反
return 2147483647;
}
}
DefaultLifecycleProcessor
public class DefaultLifecycleProcessor implements LifecycleProcessor, BeanFactoryAware {
private final Log logger = LogFactory.getLog(this.getClass());
private volatile long timeoutPerShutdownPhase = 30000L;
private volatile boolean running;
@Nullable
private volatile ConfigurableListableBeanFactory beanFactory;
***************
构造方法
public DefaultLifecycleProcessor() {
}
***************
相关方法
public void setTimeoutPerShutdownPhase(long timeoutPerShutdownPhase) {
this.timeoutPerShutdownPhase = timeoutPerShutdownPhase;
}//设置容器关闭时等待时间,默认为30s
******************************
Ejemplo: stop (devolución de llamada ejecutable) usa el método predeterminado, call callback.run ()
CustomSamrtLifeCycle
@Component
public class CustomSmartLifeCycle implements SmartLifecycle {
private boolean isRunning=false;
public void setRunning(boolean running) {
isRunning = running;
}
@Override
public boolean isRunning() {
return isRunning;
}
@Override
public void start() {
System.out.println("开始执行:"+LocalDateTime.now());
this.setRunning(true);
}
@Override
public void stop() {
System.out.println("stop:"+ LocalDateTime.now());
this.setRunning(false);
}
}
*************************
Salida de la consola
Nota: ctrl + c, la aplicación se cierra inmediatamente
******************************
Ejemplo: stop (devolución de llamada ejecutable) no llama a callback.run ()
CustomSmartLifeCycle
@Component
public class CustomSmartLifeCycle implements SmartLifecycle {
private boolean isRunning=false;
public void setRunning(boolean running) {
isRunning = running;
}
@Override
public boolean isRunning() {
return isRunning;
}
@Override
public void start() {
System.out.println("开始执行:"+LocalDateTime.now());
this.setRunning(true);
}
@Override
public void stop() {
System.out.println("stop:"+ LocalDateTime.now());
this.setRunning(false);
}
@Override
public void stop(Runnable callback) {
this.stop();
}
}
*************************
Salida de la consola
Nota: ctrl + c, la aplicación se cierra después de 30 s
******************************
Ejemplo: establecer el tiempo de apagado predeterminado
CustomSmartLifeCycle
@Component
public class CustomSmartLifeCycle implements SmartLifecycle {
private boolean isRunning=false;
public void setRunning(boolean running) {
isRunning = running;
}
@Override
public boolean isRunning() {
return isRunning;
}
@Override
public void start() {
System.out.println("开始执行:"+LocalDateTime.now());
this.setRunning(true);
}
@Override
public void stop() {
System.out.println("stop:"+ LocalDateTime.now());
this.setRunning(false);
}
@Override
public void stop(Runnable callback) {
this.stop();
}
}
WebConfig
@Configuration
public class WebConfig {
@Bean("lifecycleProcessor") //需指定bean的id:lifecycleProcessor
public DefaultLifecycleProcessor initDefaultLifeCycleProcessor(){
DefaultLifecycleProcessor defaultLifecycleProcessor=new DefaultLifecycleProcessor();
defaultLifecycleProcessor.setTimeoutPerShutdownPhase(20000L);
return defaultLifecycleProcessor;
}
}
*************************
Salida de la consola
Nota: el tiempo de apagado predeterminado se establece en 20 s