実際の開発では、多かれ少なかれいくつかのスケジュールされたタスクのシナリオが使用されます。この記事では、一般的に使用されるスケジュールされたタスクについて説明します。
一般的に使用されるタイミング タスクの実装ソリューションには次のものがあります。
Timer
: これは、Java に付属する java.util.Timer クラスです。このクラスを使用すると、java.util.TimerTask
タスクをスケジュールできます。 。この方法を使用すると、指定された時間ではなく、特定の頻度でプログラムを実行できます。一般的にはあまり使用されません。 ScheduledExecutorService
: これも jdk に付属するクラスであり、スレッド プール設計に基づいたスケジュールされたタスク クラスです。各スケジュールされたタスクは、次のように割り当てられます。スレッド プール スレッドが実行されます。つまり、タスクは同時に実行され、互いに影響しません。 Spring タスク
:Spring3.0
今後のタスクでは、これを軽量の Quartz とみなして使用できます。Quartz よりもはるかに単純です。 Quartz
: これは、指定した時間または周波数でプログラムを実行できるようにする比較的強力なスケジューラです。設定は少し複雑です。 これは現在プロジェクトで使用されることはほとんどなく、デモ コードが直接投稿されます。
詳細な紹介については、API をご覧ください:
public class TestTimer { public static void main(String[] args) { TimerTask timerTask = new TimerTask() { @Override public void run() { System.out.println("task run:"+ new Date()); } }; Timer timer = new Timer(); //安排指定的任务在指定的时间开始进行重复的固定延迟执行。这里是每3秒执行一次 timer.schedule(timerTask,10,3000); } }
このメソッドはタイマーに似ています。デモを見てください:
public class TestScheduledExecutorService { public static void main(String[] args) { ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor(); // 参数:1、任务体 2、首次执行的延时时间 // 3、任务执行间隔 4、间隔时间单位 service.scheduleAtFixedRate(()->System.out.println("task ScheduledExecutorService "+new Date()), 0, 3, TimeUnit.SECONDS); } }
Spring Boot プロジェクトでは、アノテーションを使用して、スケジュールされたタスクを非常にエレガントに実装できます。まず、プロジェクトを作成し、依存関係をインポートします。 :
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
タスク クラスを作成します:
@Slf4j @Component public class ScheduledService { @Scheduled(cron = "0/5 * * * * *") public void scheduled(){ log.info("=====>>>>>使用cron {}",System.currentTimeMillis()); } @Scheduled(fixedRate = 5000) public void scheduled1() { log.info("=====>>>>>使用fixedRate{}", System.currentTimeMillis()); } @Scheduled(fixedDelay = 5000) public void scheduled2() { log.info("=====>>>>>fixedDelay{}",System.currentTimeMillis()); } }
メイン クラスで @EnableScheduling アノテーションを使用して、スケジュールされたタスクのサポートを有効にして、プロジェクトを開始します
3 つのスケジュールされたタスクがすべて実行され、それらが同じスレッド内で連続して実行される場合、スケジュールされたタスクが 1 つだけであれば、これは間違いなく問題ありません。スケジュールされたタスクの数が増加すると、 1 つのタスクが停止すると、他のタスクは実行できなくなります。
従来の Spring プロジェクトでは、xml 構成ファイルにタスク構成を追加できますが、Spring Boot プロジェクトでは通常、構成を追加するために config 構成クラスを使用します。新しい AsyncConfig
class
@Configuration @EnableAsync public class AsyncConfig { /* 此处成员变量应该使用@Value从配置中读取 */ private int corePoolSize = 10; private int maxPoolSize = 200; private int queueCapacity = 10; @Bean public Executor taskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(corePoolSize); executor.setMaxPoolSize(maxPoolSize); executor.setQueueCapacity(queueCapacity); executor.initialize(); return executor; } }
@Configuration
: このクラスが構成クラスであることを示します@EnableAsync
: 非同期イベントのサポートを有効にします
次に、スケジュールされたタスクのクラスまたはメソッドに @Async
を追加します。最後にプロジェクトを再起動します。各タスクは別のスレッドにあります。
上記のスケジュールされたタスクでは、メソッドの @Scheduled アノテーションを使用してタスクの実行時間を設定します。 3 つのプロパティ設定方法を使用します:
initialDelay
と組み合わせて変更して、タスクの遅延実行時間を定義できることがわかります。 cron 式には少なくとも 6 つの値が含まれます(おそらく 7 つ) スペースで区切られた時間要素。順序:
「*」文字はすべての可能な値を表します 「/」文字は値の増分を指定するために使用されます例: 部分式 (分) の「0/15」は、0 分から 15 分ごとに開始することを意味します。 部分式(分)の「3/20」は、3分から20分ごと(「3、23、43」と同じ意味です)
"?"を意味します。文字は、日 (月) と日 (週) の 2 つの部分式でのみ使用され、値が指定されていないことを示します。 2 つの部分式のいずれかに値が割り当てられている場合、競合を避けるために、もう一方の部分式の値を「?」に設定する必要があります。
「L」文字は日 (月) にのみ使用されます。および day (week) は 2 つの部分式であり、単語「last」の省略形です。 「L」の前に何か特定のものがある場合、それは他の意味を持ちます。
#W 文字は平日 (月曜から金曜) を表し、日中にのみ使用できます。ドメイン。指定した日付に最も近い平日を指定するために使用されます。ほとんどの業務処理は週の労働時間に基づいているため、W の文字は非常に重要です。例: 「6L」は今月の 6 日から末日までを意味します 注: 「L」パラメータを使用する場合は、問題が発生するため、リストまたは範囲を指定しないでください。
たとえば、日フィールドの 15W は、「月の 15 日に最も近い平日」を意味します。15 日が土曜日の場合、トリガーは 14 日 (金曜日) にトリガーされます。木曜日は月曜日よりも小さいので、15日に近いからです。C: 「カレンダー」の略です。これは、スケジュールに関連付けられた日付、または日付が関連付けられていない場合はカレンダー内のすべての日付を意味します。たとえば、日付フィールドの 5C は、カレンダーの 5 日後の最初の日に相当します。曜日フィールドの 1C は、日曜日の後の最初の日に対応します。
フィールド 許可される値 許可される特殊文字 ##秒 ##分0~59 , - * / 時間 0~59 , - * / #0~23 , - * / 日付 1-31 1~12 または JAN~DEC, - * ? / L W C ##month 1~7 または SUN~SAT , - * / 平日 空白のまま、1970~2099 , - * ? / L C #年 (オプション) 、- * / 在线cron表达式生成:http://qqe2.com/cron/index
整合Quartz
添加依赖 如果Spring Boot版本是2.0.0以后的,则在spring-boot-starter中已经包含了quart的依赖,则可以直接使用
spring-boot-starter-quartz
依赖:<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency>ログイン後にコピー如果是1.5.9则要使用以下添加依赖:
<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.0</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> </dependency>ログイン後にコピー这里我使用Spring Boot版本是
2.0.0.BUILD-SNAPSHOT
,该版本开始集成了Quartz,所以事实现起来很方便。其它好像比较麻烦,这里就不介绍,以后有时间再详细深入了解Quartz。
创建任务类TestQuartz,该类主要是继承了QuartzJobBean public class TestQuartz extends QuartzJobBean { /** * 执行定时任务 * @param jobExecutionContext * @throws JobExecutionException */ @Override protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException { System.out.println("quartz task "+new Date()); } }ログイン後にコピー
创建配置类 QuartzConfig
@Configuration public class QuartzConfig { @Bean public JobDetail teatQuartzDetail(){ return JobBuilder.newJob(TestQuartz.class).withIdentity("testQuartz").storeDurably().build(); } @Bean public Trigger testQuartzTrigger(){ SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(10) //设置时间周期单位秒 .repeatForever(); return TriggerBuilder.newTrigger().forJob(teatQuartzDetail()) .withIdentity("testQuartz") .withSchedule(scheduleBuilder) .build(); } }ログイン後にコピー
启动项目 最后
上面都是简单的介绍了关于Spring Boot定时任务的处理,直接使用SpringTask注解的方式应该是最方便的,而使用Quartz从2.0开始也变得很方便。对于这两种方式,应该说各有长处吧,按需选择。
以上がSpring Boot で複数のスケジュールされたタスクを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。
関連ラベル:ソース:Java后端技术全栈このウェブサイトの声明この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。著者別の最新記事
2023-08-28 16:45:46 2023-08-28 16:43:23 2023-08-28 15:16:25 2023-08-28 15:11:34 2023-08-28 15:09:05 2023-08-25 15:55:30 2023-08-25 15:52:43 2023-08-25 15:48:00 2023-08-25 15:44:19 2023-08-24 15:59:02最新の問題Web ページのサイズを変更するとブートストラップ スイッチが正しく動作しない これはコードです: <navxmlns:sec="http://www.thymeleaf.org/extras/spring-security"clas...から 2024-04-05 08:45:39013443関連トピック詳細>