web-dev-qa-db-ja.com

Spring Bootコマンドラインアプリケーションをシャットダウンする方法

私は、Spring Bootを使用してコマンドラインJavaアプリケーションを迅速に動作させるためにアプリケーションを構築しています。

アプリケーションは、さまざまな種類のファイル(CSVなど)をロードし、Cassandra=データベースにロードします。Webコンポーネントは使用しません。Webアプリケーションではありません。

私が抱えている問題は、作業が完了したらアプリケーションを停止することです。以下に示すように、Spring CommandLineRunnerインターフェースを@Componentで使用してタスクを実行していますが、作業が完了してもアプリケーションが停止せず、何らかの理由で実行し続け、方法を見つけることができませんやめて.

@Component
public class OneTimeRunner implements CommandLineRunner {

    @Autowired
    private CassandraOperations cassandra;

    @Autowired
    private ConfigurableApplicationContext context;

    @Override
    public void run(String... args) throws Exception {
        // do some work here and then quit
        context.close();
    }
}

[〜#〜] update [〜#〜]:プロジェクトには他に何もないため、問題はspring-cassandraのようです。スレッドをバックグラウンドで実行し続けてアプリケーションの停止を妨げる理由を誰もが知っていますか?

[〜#〜] update [〜#〜]:最新のスプリングブートバージョンに更新することで問題が解消されました。

28
ESala

答えは、まだ何をしているのかによって異なります。おそらく、スレッドダンプで確認できます(たとえば、jstackを使用)。しかし、Springによって開始されたものであれば、ConfigurableApplicationContext.close()を使用してmain()メソッド(またはCommandLineRunner)でアプリを停止できるはずです。

15
Dave Syer

私は解決策を見つけました。これを使用できます:

public static void main(String[] args) {
    SpringApplication.run(RsscollectorApplication.class, args).close();
    System.out.println("done");
}

実行時に.closeを使用するだけです。

27
ACV

これは、 @ EliuX answerと @ Quan Vo oneの組み合わせです。あなたがた両方に感謝します!

主な違いは、SpringApplication.exit(context)応答コードをパラメーターとしてSystem.exit()に渡すことです。そのため、Springコンテキストを閉じるときにエラーが発生した場合に気付くでしょう。

SpringApplication.exit()は、Springコンテキストを閉じます。

System.exit()はアプリケーションを閉じます。

@Component
public class OneTimeRunner implements CommandLineRunner {

    @Autowired
    private ConfigurableApplicationContext context;

    @Override
    public void run(String... args) throws Exception { 
       System.exit(SpringApplication.exit(context));
    }
}
9
Abel ANEIROS

また、現在のプロジェクト(スプリングブートアプリケーション)でこの問題に遭遇しました。私の解決策は次のとおりです。

_// releasing all resources
((ConfigurableApplicationContext) ctx).close();
// Close application
System.exit(0);
_

context.close()は、コンソールアプリケーションを停止せず、リソースを解放するだけです。

5
Quan Vo

使用する org.springframework.boot.SpringApplication#exit。例えば。

@Component
public class OneTimeRunner implements CommandLineRunner {

    @Autowired
    private ConfigurableApplicationContext context;

    @Override
    public void run(String... args) throws Exception { 
        SpringApplication.exit(context);
    }
}
1
EliuX