Grails Service类检测应用程序关闭的最佳方法?

时间:2011-04-05 21:27:49

标签: grails groovy service application-lifecycle

我有一个Grails服务类,当我的Tomcat应用程序服务器关闭时需要进行一些清理。

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

最好的方法是什么?

谢谢!

4 个答案:

答案 0 :(得分: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依赖项

答案 1 :(得分:5)

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

def init = {
  println 'Hello World!'
}

def destroy = {
  println 'Goodnight World!'
}

注意:在某些操作系统grails run-app上使用开发模式CTL+C时,如果没有干净关闭的机会就会终止JVM,并且可能无法调用destroy闭包。此外,如果您的JVM获得kill -9,则关闭也不会运行。

答案 2 :(得分:1)

我会尝试将服务注入Bootstrap,然后从destroy块调用该方法,因为在应用程序终止时执行destroy块,如下所示:

class BootStrap {

    def myService

    def init = {servletContext ->
    }

    def destroy = {
       myService.cleanUp()
    }
}

答案 3 :(得分:0)

它与服务处理方法并不完全相同,但我最终做的是使用在应用程序停止时调用的shutdown方法注册Spring Bean。

首先,创建一个bean类,如grails-app/utils/MyShutdownBean.groovy,如下所示(类名或方法名称没有任何神圣之处,使用你想要的任何东西):

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

然后在grails-app/conf/spring/resources.groovy中注册bean,如下所示:

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

如果您只想在生产中进行清理,可以将其注册为:

beans = {
    if (!grails.util.GrailsUtil.isDevelopmentEnv()) {
        myShutdownHook(MyShutdownBean) { bean ->
            bean.destroyMethod='cleanup'
        }
    }
}