6

Tomcatアプリケーションサーバーがシャットダウンしたときにクリーンアップを実行する必要があるGrailsサービスクラスがあります。

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一部のOSで開発モードを使用CTL+Cすると、クリーンシャットダウンの機会なしにJVMが強制終了され、destroyクロージャーが呼び出されない場合があります。また、JVMがkill -9クロージャを取得した場合、クロージャも実行されません。

于 2011-04-06T02:31:32.840 に答える
1

アプリケーションが終了するとdestroyブロックが実行されるため、Bootstrapにサービスを挿入してから、destroyブロックからメソッドを呼び出してみます。次のようになります。

class BootStrap {

    def myService

    def init = {servletContext ->
    }

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

これはサービスの破棄方法とはまったく同じではありませんが、私がやったことは、アプリの停止時に呼び出されるシャットダウン方法で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'
        }
    }
}
于 2011-04-05T22:32:32.457 に答える