0

main()Beanを起動するためだけに本格的な Web アプリケーションをデプロイして実行するのではなく、いくつかの Spring Bean をメソッドから実行するためのミニ フレームワークを作成しました。次のようになります。

public abstract class BaseLauncher {

    private static final String APP_CONTEXT_PATH = "com/project/dev/launchers/launchersApplicationContext.xml";
    static ApplicationContext context = new ClassPathXmlApplicationContext(APP_CONTEXT_PATH);

    protected void launch() {
        context.getBean(getClass()).perform();
        //The process never ends so we want to know when we can kill it
        System.out.println("launcher finished");
    }

    @Transactional
    abstract protected void perform();

}

ランチャーの例は次のようになります。

@Component
public class ParamLoaderLauncher extends BaseLauncher {
    @Inject
    ParamLoader paramLoader;

    public static void main(String[] args) {
        new ParamLoaderLauncher().launch();
    }

    @Override
    protected void perform() {
        paramLoader.loadParams();
    }
}

呼び出された Bean メソッドが終了すると、アプリケーションはそのまま実行され続け、手動で強制終了する必要があることを除いて、すべてうまく機能します。春のアプリコンテキストを使用することに関係があると思います。たぶん、いくつかの特別な春関連の非デーモンスレッドが開始されますか? もしそうなら、それを殺す方法はありますか?または、このような単純なコードには、他にどのような原因があるのでしょうか?

4

1 に答える 1

3

スタンドアロンアプリケーション(どのコンテナでも実行されていない)の場合、アプリケーションの終了時にSpringコンテナをクリーンシャットダウンするためにshutdownhookを登録する必要があります。

于 2012-10-24T08:13:00.430 に答える