一度生成されたスレッドを持つスプリングブートスレッドプールプロジェクトを作成しましたが、メンテナンスのためにサーバーでアプリケーションを停止する必要があるとき現在のタスクを完了した後にシャットダウンし、新しいタスクを実行しません。24時間365日実行中のSpringブートスレッドプールプロジェクトを友好的にシャットダウンする
同じのための私のコードは次のとおりです。 Configクラス
@Configuration
public class ThreadConfig {
@Bean
public ThreadPoolTaskExecutor taskExecutor(){
ThreadPoolTaskExecutor executorPool = new ThreadPoolTaskExecutor();
executorPool.setCorePoolSize(10);
executorPool.setMaxPoolSize(20);
executorPool.setQueueCapacity(10);
executorPool.setWaitForTasksToCompleteOnShutdown(true);
executorPool.setAwaitTerminationSeconds(60);
executorPool.initialize();
return executorPool;
}
}
のRunnableクラス
@Component
@Scope("prototype")
public class DataMigration implements Runnable {
String name;
private boolean run=true;
public DataMigration(String name) {
this.name = name;
}
@Override
public void run() {
while(run){
System.out.println(Thread.currentThread().getName()+" Start Thread = "+name);
processCommand();
System.out.println(Thread.currentThread().getName()+" End Thread = "+name);
if(Thread.currentThread().isInterrupted()){
System.out.println("Thread Is Interrupted");
break;
}
}
}
private void processCommand() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void shutdown(){
this.run = false;
}
}
メインクラス:私は停止する必要がある場合は理解して助けを必要と
@SpringBootApplication
public class DataMigrationPocApplication implements CommandLineRunner{
@Autowired
private ThreadPoolTaskExecutor taskExecutor;
public static void main(String[] args) {
SpringApplication.run(DataMigrationPocApplication.class, args);
}
@Override
public void run(String... arg0) throws Exception {
for(int i = 1; i<=20 ; i++){
taskExecutor.execute(new DataMigration("Task " + i));
}
for (;;) {
int count = taskExecutor.getActiveCount();
System.out.println("Active Threads : " + count);
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (count == 0) {
taskExecutor.shutdown();
break;
}
}
System.out.println("Finished all threads");
}
}
私の春のブートアプリケーションは、実行するすべての20のスレッドを停止する必要があります(24x7)oth whileループと終了で現在のループを完了した後にerwiseします。
ありがとうございます。しかし、もう一つ理解する必要があります。私はこの春のブートの瓶を作り、Linux環境で動かします。どうすればこのプロセスを止めることができますか?私はそれを24時間365日稼働するように設計し、何らかのタスクを実行する必要があるため、スプリングブートを停止しようとすると、新しいwhileループを開始する前に現在の実行タスクを完了して停止する必要があります。コードデザインで私を助けてください。ありがとう –
答えを明確にしました。それが助けてくれることを願って –
ありがとう。返信のために!そして、アプリケーションをシャットダウンするためにlinux envのJMX終了エンドポイントを呼び出す方法。 –