6

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

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

最好的方法是什么?

谢谢!

4

4 回答 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 依赖项

于 2011-04-06T08:40:26.583 回答
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了闭包,也不会运行。

于 2011-04-06T02:31:32.840 回答
1

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

class BootStrap {

    def myService

    def init = {servletContext ->
    }

    def destroy = {
       myService.cleanUp()
    }
}
于 2011-04-06T17:29:24.187 回答
0

它与服务处理方法不太一样,但我最终做的是注册一个 Spring Bean 和一个在应用程序停止时调用的关闭方法。

首先,创建一个 bean 类,grails-app/utils/MyShutdownBean.groovy如下所示(类名或方法名没有什么神圣之处,随意使用):

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

然后像这样注册bean 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'
        }
    }
}
于 2011-04-05T22:32:32.457 回答