Spring Boot マルチスレッド同時タイミング タスク ソリューション

スケジュールされたタスクを実装する Spring Boot に関する記事を読んだところですが、かなりいい感じです。Spring Boot は、Spring 独自の Schedule を使用して、タイミング タスクを非常に簡単かつ便利に実装します。ここでみんなと共有してください。

注釈のキャッシングを有効にする

@SpringBootApplication
@EnableScheduling //开启定时任务
public class Application {
  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }
}

時限タスクを書く

@Component
public class ScheduledTasks {
  private Logger logger = LoggerFactory.getLogger(ScheduledTasks.class);
  // cron接受cron表达式,根据cron表达式确定定时规则
  @Scheduled(cron="0/5 * * * * ? ")  //每5秒执行一次 
  public void testCron() {
  DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
   logger.info(sdf.format(new Date())+"*********每5秒执行一次");
  }
}

ミッション完了

プロジェクトを開始し、コンソールの印刷情報を確認して、スケジュールされたタスクが有効になっていることを確認します。Spring Boot と Scheduled の統合が完了しました。

問題があります

しかし、いくつかのタスクを同時にテストすると、すべてのタスクが同じスレッド プール内の同じスレッドによって完了されることがわかりました。実際の開発プロセスでは、すべてのタスクを 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秒执行一次");
}
@Scheduled(cron="0/4 * * * * ? ")  //每4秒执行一次 
public void testCron4() {
  DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
  logger.info(sdf.format(new Date())+"*********每4秒执行一次");
}

解決

では、並行性を実現するためにマルチスレッドとして設計するにはどうすればよいでしょうか? 私はそのような解決策をオンラインで見ました。ScheduleConfig 構成ファイルを介して SchedulingConfigurer インターフェースを実装し、setSchedulerfang メソッドを書き換えます。

@Configuration
public class ScheduleConfig implements SchedulingConfigurer {
 @Override
 public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
   taskRegistrar.setScheduler(Executors.newScheduledThreadPool(5));
 }
}

@Scheduled でサポートされるパラメーター:

1.cron: 特定の時間に実行するタスクを指定する cron 式; 2.fixedDelay: 最後のタスクの実行が完了してからの時間を示し、パラメーターの型は long、単位は ms; 3.fixedDelayString:意味は fixedDelay と同じですが、パラメータの型は 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 23 * * ? 毎日 1 時に 1 回実行朝の時計: 0 0 1 * * ? 毎月 1 日の午前 1 時に 1 回実行: 0 0 1 1 * ? 毎月最終日の 23:00 に 1 回実行: 0 0 23 L * ? 実行毎週日曜日の午前 1 時に 1 回: 0 0 1 ? * L 26、29、および 33 に 1 回実行: 0 26,29,33 * * * ? 毎日 0:00、13:00、18:00 に 1 回実行および 21:00: 0 0 0,13,18,21 * * ?

実際、Cron 式を知らなくても心配する必要はありません.インターネット上にはオンライン Cron ジェネレーターがたくさんあります.オンライン ジェネレーターを介して要件を満たす cron を生成できます.これも非常に便利です.

おすすめ

転載: blog.csdn.net/qq_36647209/article/details/130382758