我有一个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 {
}
}
在我看来,注释选项更可取,因为您可以给析构函数方法命名比destroy
更有意义,并且您的类公共API不会暴露Spring依赖。
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
,则该闭包也不会运行。class BootStrap {
def myService
def init = {servletContext ->
}
def destroy = {
myService.cleanUp()
}
}
这不完全是一个服务处理方法,但我最终做的是注册一个Spring Bean,该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'
}
}
}