4

ApplicationContextInitializer実装で使用されているリソースを完全にシャットダウンするにはどうすればよいですか?

ApplicationContextInitializerCurator プロジェクトを使用して Zookeeper に接続し、プロパティ ファイルを取得する実装を作成しました。Properties次に、インスタンス aを作成し、それをPropertiesPropertySourceコンテキストに追加します。

close()アプリケーションがシャットダウンしたときに、初期化子のメンバーであったCuratorFrameworkインスタンスを呼び出せるようにしたいと考えています。これはどのように行うのが最善ですか?

Bean として使用できるように、CuratorFrameworkインスタンスコンテキストに渡すこともできますか?

4

3 に答える 3

4

ApplicationContextInitializer、次を追加できますApplicationListener<ContextClosedEvent>

class MyContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
        @Override
        public void initialize(ConfigurableApplicationContext applicationContext) {

            applicationContext.addApplicationListener(new ApplicationListener<ContextClosedEvent>() {
                @Override
                public void onApplicationEvent(ContextClosedEvent event) {
                    /* Cleanup code */
                }
            });
        }
    }

于 2019-07-25T10:58:26.463 に答える
1

春のイベントを取得する Bean を作成し、それを使用してキュレーターを閉じます。

public class CuratorDisposer implements DisposableBean { 
    private CuratorFramework delegate; //set through spring somehow

    public void destroy() {
          delegate.close();
    }  
}
于 2012-09-10T13:42:12.850 に答える
1

アプリケーションがシャットダウンしたときに、初期化子のメンバーである CuratorFramework インスタンスで close() を呼び出せるようにしたいと考えています。これはどのように行うのが最善ですか?

イニシャライザ クラスに を実装さApplicationListenerせ、それ自体をコンテキストのリスナーとして登録することができます。ContextClosedEventその後、コンテキストがシャットダウンしたときにを受け取ります。

Bean として使用できるように、CuratorFrameworkインスタンスコンテキストに渡すこともできますか?

イニシャライザで次のようなことを行うことができます(テストされていません):

RootBeanDefinition cfDef = new RootBeanDefinition(MethodInvokingFactoryBean.class);
cfDef.getPropertyValues().add("targetClass", MyInitializer.class);
cfDef.getPropertyValues().add("targetObject", this);
cfDef.getPropertyValues().add("targetMethod", "getCuratorFramework");
((BeanDefinitionRegistry)ctx).registerBeanDefinition("curatorFramework", cfDef);

そして、初期化クラスにメソッドを追加して、初期化時に作成しgetCuratorFramework()た を返します。CuratorFramework

于 2012-09-10T13:48:48.750 に答える