我有一个需要做一些清理工作时,我的Tomcat应用服务器关闭一个Grails服务类。
我没有看到有关service.stop在Grails的文档任何东西()或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
关闭要么不会运行。
当应用程序被终止,因为在执行销毁块我会尝试注入服务到引导,然后调用从破坏块的方法,是这样的:
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
}
}
然后注册在这样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'
}
}
}