序文
数日間のために書く、と最近ちょうどタイミングタスクの統計を行うために働いて少し忙しい仕事なので、どのようにspringbootは、スケジュールされたタスクの順番ビットが作成されますしませんでした。
全体的に、springbootスケジュールされたタスクは非常に簡単です作成し、プロジェクトが始まったとき、スプリングまたはxmlファイルを設定するには、springmvc必要がロードされて好きではありません。注釈は途中、我々は完全に定期的なタスクをサポートすることができます使用して春ブーツ。
しかし、基礎ノート、それはいくつかの時間がかかるかもしれない定期的なタスクは、多くの場合、そうそこに、定期的なタスクを実行し、変更悪い注釈を変更し、それぞれが再コンパイルされなければならなかったので、私は、データベースのアラーム時刻に存在し、データベースプロジェクトを読みたいと思う必要がありますタスク・インターフェースのタイミングに基づいて。ここでのポイントベースのインターフェースベースの注釈です、詳細に説明します。
ノートに基づいて、
修正なしのpom.xmlファイルには、我々は実際には、タイマーがspringbootフレームワークである任意の依存関係を導入することなく、来て、プロジェクトをサポートしなければなりませんでした。私たちは、直接自動タスクパッケージを作成する自動タスククラスを作成します。
@EnableScheduling
@Component
@Slf4j
public class AutoTask {
@Scheduled(cron="*/6 * * * * ?")
private void process(){
log.info("autoTask ");
}
}
それを作成するために、このようなタイマーは、プロジェクト開始後、それはすべての6Sをログ「自動タスク」を印刷します。それは非常に簡単ではありません。2冊のノートには、主に@EnableSchedulingと@Scheduledを使用しています。
ノート@EnableSchedulingは、定期的なタスクを開くことです。あなたは、このクラスに注釈を結合するために、定期的に実行したいクラスのメソッド。もちろん、これは、この注釈は、起動クラスに追加することができます。スケジュールされたタスクを作成することができ、すべてのクラスで、プロジェクトの開始は、クラスに表し追加しました。
@Scheduled注釈はcronのタスクが、時限式でタイマーの後ろに私たちの共通の友人です。方法についての注意事項は、この方法では、定期的に表しています。
しかし@Scheduledは、2つの構成で行うことができ、我々はクーロンに精通している、fixedRateがあります。例えばfixedRateため= 6000は、6秒ごとを実行する方法を示しています。
私たちは、プロジェクトを開始するために見て、あなたは二つの方法が定期的に実行されて見ることができます。
ベースのインタフェース
注釈が非常に便利であるベースspringbootの上に見ることができます。しかし、それは経営の頻繁な変更またはプロジェクトのために便利ではありませんタイマーがたくさんあります。だから、統一タイマー情報はデータベースに保存されています。
DROP TABLE IF EXISTS `scheduled`;
CREATE TABLE `scheduled` (
`cron_id` varchar(30) NOT NULL PRIMARY KEY,
`cron_name` varchar(30) NULL,
`cron` varchar(30) NOT NULL
);
INSERT INTO `scheduled` VALUES ('1','定时器任务一','0/6 * * * * ?');
cronのを取得するために非常に単純なDAO層mapper1パッケージでCronMapperインターフェースを作成します。
public interface CronMapper {
@Select("select cron from scheduled where cron_id = #{id}")
public String getCron(int id);
}
ここでは、サービス層を書き込みません。パッケージの自動タスクに直接AutoTaskFromDBクラスを作成します。
@Slf4j
@Component
public class AutoTaskFromDB implements SchedulingConfigurer {
@Autowired
protected CronMapper cronMapper;
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
scheduledTaskRegistrar.addTriggerTask(() -> process(),
triggerContext -> {
String cron = cronMapper.getCron(1);
if (cron.isEmpty()) {
log.info("cron 为空");
}
return new CronTrigger(cron).nextExecutionTime(triggerContext);
}
);
}
private void process(){
log.info("formDB ");
}
}
あなたは見ることができますaddTriggerTaskは()タイマーを追加することで、それはこのSchedulingConfigurerインタフェースを実現することで、非常に簡単です。
工程()メソッドは、我々は、それを必要とタイミングによって実行される方法です。
CronTrigger(クーロン).nextExecutionTime(triggerContext)は、データベースの読み取りからのcronタイマーを作成することです。
私は、起動クラスに追加したので、あなたが開始するためにクラスを追加し、プラスここで覚えていない場合、私は、このクラス@EnableSchedulingコメントを追加しませんでした。
テスト;あなたは3時限タスクが実行されて見ることができ、次のチャートは、fromDBがデータベースから読み取られます。
cronの
多くのオンラインのcronの利用があり、ここには話は次のレコードが来ていません
構造
cronの式は、6つのまたは7分野に分け、文字列、各2つのドメイン間のスペースで区切られた、ある
「周月ドメインのドメインのドメインの第二のドメインとドメインのドメインタイムドメインの日」:ある構文
レンジ
ドメイン名 | 可能な値 |
---|---|
秒フィールド | 0〜59の整数 |
フェンウィック | 0〜59の整数 |
タイムドメイン | 0〜23の整数 |
日域 | 1〜31の整数であり、 |
ドメイン月 | それとも1月12日〜12月まで1の整数 |
周ドメイン | 1〜7日〜土のまたは整数 |
ドメインで | これは、2099年から1970年の整数です。 |
一般的な方法
表現 | 意味 |
---|---|
5秒ごとに実行 | * / 5 * * * *? |
毎分一度実行 | 0 * / 1 * * *? |
1時は一日一回実行します | 0 0 1 * *? |
一日一回実行23時55分 | 0 55 23 * *? |
一度実行毎月午前23時の最後の日 | 0 0 23のL *? |
土曜日午前8時00実行時間 | 0 0 8?* L |
毎月最終金曜日、二時間おきに実行します | 0 0 * / 2?* 6L |
10:15の実行時に、各月の第3金曜日 | 0 15 10?* 5#3 |
2:05 pmまで2:00 pmに、日中は1分ごとに実行 | 0 0-5 14 * *? |
実行するために、毎日10:15で月曜日から金曜日までに彼女を言いました | 0 15 10?* 2-6 |
10:15午前実行時の各月の最終金曜日 | 0 15 10?* 6L |
毎日10時00分、午後2時、4時の実行時間 | 0 0 10,14,16 * *? |
北朝鮮9 5へのジョブの実行時間の半時間ごとに一度 | 0 0/30 9-17 * *? |
一度実行毎週水曜日12時00分 | 0 0 12?* 4 |
月の水曜日の午後1回ずつ行わ2時10分と午前2時44分、毎年 | 0 10,44 14?3 4 |
10:15の実行時に、各月の第3金曜日 | 0 15 10?* 6#3 |
第1回の実行時間の午前2時30分で月間 | 0 30 2 1 *? |
最初の20秒で、毎分10秒が行われます | 10,20 * * * *? |
最初の2週間の月間週5、早朝の実行 | 0 0 0?* 6#2 |
番外
実際には、この知識はについて話すためにここに置かれるべきではありませんが、あまり、ちなみに、書いた、ちょうどタイマーを行うことができます。私たちのプロジェクトは、多くの場合、これはどのように我々が達成していること、プロジェクトが始まったときに実行するために必要ないくつかの要件があります。実際には、春のブーツはApplicationRunner十分に実現するために、使用することも非常に簡単です。
私たちは、自動タスクパッケージ内のクラスを作成AutoTaskFromSpringRunner
@Slf4j
@Component
public class AutoTaskFromSpringRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
process();
}
private void process(){
log.info(" run ApplicationArguments");
}
}
プロジェクトの外観を開始し、あなたはそれが一度だけのプロジェクトがスタートした後に実行されますが、見つけることができます。
このタイマーは、どのように行うことを行うために使用されていますか?もちろん、スレッドの組み合わせは、それを行うには、この方法は実際にはお勧めしません、B、結局、間違ったスレッドを行くが、アイデアを提供するために非常に簡単:
@Slf4j
@Component
public class AutoTaskFromSpringRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
process();
new Thread(() -> {
while (true) {
process2();
try {
Thread.sleep(6000);
} catch (InterruptedException e) {
log.error("{}",e);
}
}
}).start();
}
private void process(){
log.info(" run ApplicationArguments");
}
private void process2(){
log.info("线程定时器");
}
}
プロジェクトに表情を開始し、それはまた、タイマーの役割を果たすことができました。
まあ、そんなにあなたのために、今日のコードは、githubの友人のプロジェクトに同期されます。
githubのアドレスします。https://github.com/QuellanAn/zlflovemm
従って、是非♡
個人の社会的関心の番号へようこそ「プログラマは、ヨーグルトが大好きです」
Javaの、Linuxでは、ビッグデータを含む学習教材の多様性を共有します。自分自身と高品質の技術のブログの配信を共有しながら情報は、ビデオドキュメントとソースコードが含まれています。
あなたが注目を好きよ❤を共有することを覚えていれば