针对Spring-boot应用程序捕获应用程序停止事件

时间:2016-06-16 07:57:02

标签: spring spring-boot

是否有一种干净的方法来检测弹簧启动应用程序何时停止并执行某些操作?用于停止服务的CommandLineRunner种类

提前致谢

4 个答案:

答案 0 :(得分:1)

这取决于你想要做什么,但你可以做的一件事就是有一个实现stop的bean并实现// inside view controller func mapView(mapView: MKMapView, didSelectAnnotationView view: MKAnnotationView) { if view.annotation!.isKindOfClass(MKUserLocation) { return } let customView = (NSBundle.mainBundle().loadNibNamed("PinView", owner: self, options: nil))[0] as! PinView; var calloutViewFrame = customView.frame; calloutViewFrame.origin = CGPointMake(-calloutViewFrame.size.width/2 + 15, -calloutViewFrame.size.height); customView.frame = calloutViewFrame; customView.content.text = "test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test " view.addSubview(customView) } ... class PinView: UIView { @IBOutlet weak var content: UILabel! /* // Only override drawRect: if you perform custom drawing. // An empty implementation adversely affects performance during animation. override func drawRect(rect: CGRect) { // Drawing code } */ } 方法。每当上下文停止时,您都会收到回调。请注意,它并不一定意味着进程正在关闭。如果你想在发生这种情况时调用一些代码,我会在Sven写的评论中注册一个关闭钩子。

答案 1 :(得分:1)

我已经提出了这个解决方案。如果你有更好的,请随时分享

@Component
public class PortalServiceLifeCycle implements CommandLineRunner {

static final Logger LOGGER = LoggerFactory.getLogger(PortalServiceLifeCycle.class);

@Override
public void run(String... arg0) throws Exception {
    LOGGER.info("###START FROM THE LIFECYCLE###");
}

@PreDestroy
public void onExit() {
    LOGGER.info("###STOP FROM THE LIFECYCLE###");
}
}

答案 2 :(得分:1)

不知道你是否完全解决了这个问题。我最近遇到了这个问题,并且得到了一个与众不同的解决方案。

首先,我的Spring启动应用程序是一个Tomcat嵌入式应用程序。 (这个问题的第二种方法并不取决于网络结构。不要生气,我的朋友。)在这种情况下,自然会通过注册获得捕获停止事件的想法听众我是这样做的,

@WebListener
public class HelloListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("HelloListener contextInitialized");
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("HelloListener contextDestroyed");
    }
}

并同时在Application类中添加注释@ServletComponentScan。

当然,还有其他一些注册ServletContextListener的方法,一旦你注册了它,你就可以在contextDestroyed函数中获得stop事件。

但是,这与我的问题不太匹配。我必须在春豆被摧毁之前赶上停止事件。这是第二个解决方案。

修改您的应用程序主要方法,如下所示:

    SpringApplication application = new SpringApplication(DemoApplication.class);
    application.addListeners(new MyListener());
    application.run(args);

并提供MyListener类的定义:

class MyListener implements ApplicationListener<ContextClosedEvent>{

    @Override
    public void onApplicationEvent(ContextClosedEvent contextClosedEvent) {
        // your code here
    }
}

注意:第二个解决方案与Tomcat或其他Web容器无关。 ContextClosedEvent并没有在Spring文档中引入,但我在源代码中找到了它,我认为它非常有用。

如果能帮到某人,我将非常高兴。

答案 3 :(得分:0)

ApplicationReadyEvent 类似,您可以使用 ContextClosedEvent

@Component
public class ContextClosedEventListener {

    @EventListener(ContextClosedEvent.class)
    public void onContextClosedEvent(ContextClosedEvent contextClosedEvent) {
        System.out.println("ContextClosedEvent occurred at millis: " + contextClosedEvent.getTimestamp());
    }
}