对于一个Grails服务类的最佳方式来检测应用程序关闭?

问题描述 投票:6回答:4

我有一个需要做一些清理工作时,我的Tomcat应用服务器关闭一个Grails服务类。

我没有看到有关service.stop在Grails的文档任何东西()或destroy()方法,或实现任何类型的应用程序生命周期监听器的方法。

什么是做到这一点的最好方法是什么?

谢谢!

grails groovy service application-lifecycle
4个回答
7
投票

你有几个选项

让你的服务实现org.springframework.beans.factory.DisposableBean

class MyService implements org.springframework.beans.factory.DisposableBean {

    void destroy() throws Exception {

    }
}

或用注解

class MyService {

    @PreDestroy
    private void cleanUp() throws Exception {

    }
 }

IMO,注释的选择是最好的,因为你可以给你的析构函数方法更有意义的名称比destroy和您的类的公共API不公开的Spring依赖


5
投票

当应用程序启动和停止的grails-app/conf/BootStrap.groovy都可以使用。

def init = {
  println 'Hello World!'
}

def destroy = {
  println 'Goodnight World!'
}

注:在某些操作系统的使用发展方式grails run-app CTL+C会杀死无机会JVM干净关闭和销毁关闭可能不会被调用。另外,如果您的JVM得到kill -9关闭要么不会运行。


1
投票

当应用程序被终止,因为在执行销毁块我会尝试注入服务到引导,然后调用从破坏块的方法,是这样的:

class BootStrap {

    def myService

    def init = {servletContext ->
    }

    def destroy = {
       myService.cleanUp()
    }
}

0
投票

这是不完全一样的服务处理方法,但我最终做的是注册一个Spring bean与当应用程序停止时调用关机方法。

首先,创建一个bean类,像grails-app/utils/MyShutdownBean.groovy看起来像以下(没有什么神圣的约类名或方法名,不管你想要使用):

class MyShutdownBean {
    public void cleanup() {
        // Do cleanup stuff
    }
}

然后注册在这样grails-app/conf/spring/resources.groovy豆:

beans = {
    myShutdownHook(MyShutdownBean) { bean ->
        bean.destroyMethod='cleanup'
    }
}

如果你想只做生产的清理,你可以像这样,而不是注册它:

beans = {
    if (!grails.util.GrailsUtil.isDevelopmentEnv()) {
        myShutdownHook(MyShutdownBean) { bean ->
            bean.destroyMethod='cleanup'
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.