Tomcatアプリケーションサーバーがシャットダウンしたときにクリーンアップを実行する必要があるGrailsサービスクラスがあります。
Grailsのドキュメントには、service.stop()またはdestroy()メソッド、またはあらゆる種類のアプリケーションライフサイクルリスナーを実装する方法については何も表示されません。
これを行うための最良の方法は何ですか?
ありがとう!
Tomcatアプリケーションサーバーがシャットダウンしたときにクリーンアップを実行する必要があるGrailsサービスクラスがあります。
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
一部のOSで開発モードを使用CTL+C
すると、クリーンシャットダウンの機会なしにJVMが強制終了され、destroyクロージャーが呼び出されない場合があります。また、JVMがkill -9
クロージャを取得した場合、クロージャも実行されません。
アプリケーションが終了するとdestroyブロックが実行されるため、Bootstrapにサービスを挿入してから、destroyブロックからメソッドを呼び出してみます。次のようになります。
class BootStrap {
def myService
def init = {servletContext ->
}
def destroy = {
myService.cleanUp()
}
}
これはサービスの破棄方法とはまったく同じではありませんが、私がやったことは、アプリの停止時に呼び出されるシャットダウン方法でSpringBeanを登録することです。
まず、次のような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'
}
}
}