Spring Bootマルチスレッドによるタイミングタスクの同時実行


エンジニアリングコードの例:Spring Boot統合持続化Quartzタイミングタスク管理とインタフェースの表示
工事住所:https://github.com/tjfy1992/SpringBootQuartz
運用方法Spring Bootエンジニアリングはサーバを統合しています.右クリックJAva->Run As->Javaアプリケーションでプロジェクトを実行できます.デフォルトのポートは8080で、起動後にブラウザのアドレスバーに入力します.http://localhost:8080/JobManager.html効果が見えます.
 
SpringBoot同時実行タイミングタスク
キャッシュ注記を開く
@SpringBootApplication

@EnableScheduling //      

public class Application {

           public static void main(String[] args) {

                     SpringApplication.run(Application.class, args);

           }

}

問題がある
いくつかのタスクを同時にテストすることによって、すべてのタスクが同じスレッドプール内の同じスレッドで完了していることがわかります.実際の開発では、すべてのタスクが1つのスレッドで実行されることを望んでいません.
@Scheduled(cron="0/1 * * * * ? ") // 1     

public void testCron1() {

          DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

          logger.info(sdf.format(new Date())+"********* 1     ");

}



@Scheduled(cron="0/2 * * * * ? ") // 2     

public void testCron2() {

          DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

          logger.info(sdf.format(new Date())+"********* 2     ");

}


@Scheduled(cron="0/3 * * * * ? ") // 3     

public void testCron3() {

          DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

          logger.info(sdf.format(new Date())+"********* 3     ");

}

Spring Boot使用多线程并发执行定时任务_第1张图片
ソリューション
では、マルチスレッドで同時実行を実現するにはどうすればいいのでしょうか.このような解決策をネットで見たことがあります.ScheduleConfigプロファイルでSchedulingConfigurerインタフェースを実装し、setSchedulerfangメソッドを書き換えて、構成してみました.
@Configuration
public class ScheduleConfig implements SchedulingConfigurer {
          @Override
          public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
                      taskRegistrar.setScheduler(Executors.newScheduledThreadPool(5));
          }
}
統合に成功
これでマルチスレッド同時構成が完了しますか?プロジェクトを起動してコンソール出力情報で結果を検証し、最後にすべてのタスクが同じスレッドプールで異なるスレッドで完了していることを発見し、このスキームが完全に実行可能であることを示し、spring bootマルチスレッド同時タイミングタスクを完了しました.
Spring Boot使用多线程并发执行定时任务_第2张图片

@Scheduledでサポートされているパラメータ:
1.cron:cron式、特定の時間にタスクを実行することを指定します.2.fixedDelay:前回のタスクの実行が完了してからどのくらい再実行されたかを示し、パラメータタイプはlong、単位msである.3.fixedDelayString:fixedDelayの意味と同じで、パラメータタイプがStringになるだけです.4.fixedRate:一定の頻度でタスクを実行することを表し、パラメータタイプはlong、単位msである.5.fixedRateString:fixedRateの意味と同じように、パラメータタイプをStringに変更するだけです.6.initialDelay:どのくらい遅延してから初めてタスクを実行するかを示し、パラメータタイプはlong、単位msである.7.initialDelayString:initialDelayの意味と同じように、パラメータタイプをStringに変更するだけです.8.zone:タイムゾーン、デフォルトは現在のタイムゾーンで、一般的には使用されません.
Cron式の例:
5秒ごとに実行:*/5***?1分ごとに実行:0*/1***?毎日23時に1回実行:0 0 0 23*?毎日午前1時に1回実行:0 0 1*?毎月1日午前1時に1回実行:0 0 0 1*?毎月の最終日23時に1回実行:0 0 0 23 L*?毎週日曜日の午前1時に1回実行:0 0 0 1?*Lは26分、29分、33分に1回実行:0 26,29,33**?毎日0時、13時、18時、21時に1回実行されます:0 0 0,13,18,21*?
実はCron式ができなくても心配しないで、ネット上には多くのオンラインCronジェネレータがあって、私たちは完全にオンラインジェネレータを通じて要求に合ったcronを生成することができて、とても便利です.
 
例:
import java.util.Date;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import com.isoftstone.common.utils.date.DateUtil;

/**
* @author leon
* @createDate 2018 5 9    3:25:26
* @version v1.0
* @classRemarks      
*/
@Configuration
@EnableScheduling
public class TestTask {
	
	private static Logger logger = LoggerFactory.getLogger(TestTask.class);
	
	//  3       (cron    )
	//Cron     :
	//  5     :*/5 * * * * ?
	//  1      :0 */1 * * * ?	
	//  23     :0 0 23 * * ?	
	//    1     :0 0 1 * * ?	
	//  1   1     :0 0 1 1 * ?	
	//      23     :0 0 23 L * ?	
	//       1     :0 0 1 ? * L	
	// 26 、29 、33     :0 26,29,33 * * * ?	
	//   0 、13 、18 、21      :0 0 0,13,18,21 * * ?
	//     http://www.pdtools.net/tools/becron.jsp
	@Scheduled(cron = "0 */10 * * * ?")
	public void test(){
		logger.info("test     "+DateUtil.dateToStrLong(new Date())+",   :"+System.currentTimeMillis());
	}
	
	@Scheduled(cron = "0 */10 * * * ?")
	public void test1(){
		logger.info("test1     "+DateUtil.dateToStrLong(new Date())+",   :"+System.currentTimeMillis());
	}
}
import java.util.concurrent.Executors;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;

/**
 * spring boot          
 * 		                     
 * @ClassName::ScheduleConfig 
 * @author leon
 * @createDate	2018 10 15    4:02:38 
 * @version	v1.0
 * @classRemarks TODO
 */
@Configuration
public class ScheduleConfig implements SchedulingConfigurer {
	
	@Autowired
    ThreadPoolTaskExecutor threadPoolTaskExecutor;
	
	@Override
	public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
		taskRegistrar.setScheduler(Executors.newScheduledThreadPool(8,threadPoolTaskExecutor));
	}
}