私は、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 [〜#〜]:最新のスプリングブートバージョンに更新することで問題が解消されました。
答えは、まだ何をしているのかによって異なります。おそらく、スレッドダンプで確認できます(たとえば、jstackを使用)。しかし、Springによって開始されたものであれば、ConfigurableApplicationContext.close()
を使用してmain()メソッド(またはCommandLineRunner
)でアプリを停止できるはずです。
私は解決策を見つけました。これを使用できます:
public static void main(String[] args) {
SpringApplication.run(RsscollectorApplication.class, args).close();
System.out.println("done");
}
実行時に.closeを使用するだけです。
これは、 @ 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));
}
}
また、現在のプロジェクト(スプリングブートアプリケーション)でこの問題に遭遇しました。私の解決策は次のとおりです。
_// releasing all resources
((ConfigurableApplicationContext) ctx).close();
// Close application
System.exit(0);
_
context.close()
は、コンソールアプリケーションを停止せず、リソースを解放するだけです。
使用する 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);
}
}