我有一个 Grails 服务类,当我的 Tomcat 应用程序服务器关闭时需要进行一些清理。
我在 Grails 文档中没有看到任何关于 service.stop() 或 destroy() 方法,或者实现任何类型的应用程序生命周期侦听器的方法。
最好的方法是什么?
谢谢!
我有一个 Grails 服务类,当我的 Tomcat 应用程序服务器关闭时需要进行一些清理。
我在 Grails 文档中没有看到任何关于 service.stop() 或 destroy() 方法,或者实现任何类型的应用程序生命周期侦听器的方法。
最好的方法是什么?
谢谢!
你有几个选择
使您的服务实施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 依赖项
grails-app/conf/BootStrap.groovy
可以在应用程序启动和停止时使用。
def init = {
println 'Hello World!'
}
def destroy = {
println 'Goodnight World!'
}
grails run-app
注意:在某些操作系统上使用开发模式时,CTL+C
将杀死 JVM,而没有机会完全关闭,并且可能不会调用销毁闭包。此外,如果您的 JVM 获得kill -9
了闭包,也不会运行。
我会尝试将服务注入 Bootstrap,然后从销毁块调用该方法,因为销毁块是在应用程序终止时执行的,如下所示:
class BootStrap {
def myService
def init = {servletContext ->
}
def destroy = {
myService.cleanUp()
}
}
它与服务处理方法不太一样,但我最终做的是注册一个 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'
}
}
}