Spring が Quartz を統合してスケジュールされたタスクのスケジューリングを実装する方法
最近のプロジェクトでは、定期的にメンバーポイントを計算したり、サードパーティのインターフェースを呼び出したりするなど、スケジュールされた実行タスクを実装する必要があります。このプロジェクトでは Spring Framework を使用しているため、ここでは Spring Framework と合わせて紹介します。
次のように、通常のポジョであるジョブクラス
を作成します:
package com.pcmall.task; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class TaskA { private static Logger logger = LoggerFactory.getLogger(TaskA.class); public void taskA1(){ for(int i=0;i<100;i++){ System.out.println("----A1----" + i); } } public void taskA2(){ for(int i=0;i<100;i++){ System.out.println("----A2----" + i); } } }
Spring構成ファイルに特定のタスクを設定します
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="taskA" class="com.pcmall.task.TaskA"></bean> <bean id="taskB" class="com.pcmall.task.TaskB"></bean> <bean id="taskJobA1" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="taskA"></property> <property name="targetMethod" value="taskA1"></property> <property name="concurrent" value="false"></property> </bean> <bean id="taskJobA2" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="taskA"></property> <property name="targetMethod" value="taskA2"></property> <property name="concurrent" value="false"></property> </bean> <bean id="taskJobB1" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="taskB"></property> <property name="targetMethod" value="taskB1"></property> <property name="concurrent" value="false"></property> </bean> <bean id="taskJobB2" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="taskB"></property> <property name="targetMethod" value="taskB2"></property> <property name="concurrent" value="false"></property> </bean> <bean id="taskA1Trigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail"> <ref bean="taskJobA1" /> </property> <property name="cronExpression"> <value>0 0/1 * * * ?</value> </property> </bean> <bean id="taskA2Trigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail"> <ref bean="taskJobA2" /> </property> <property name="cronExpression"> <value>0 0/2 * * * ?</value> </property> </bean> <bean id="taskB1Trigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail"> <ref bean="taskJobB1" /> </property> <property name="cronExpression"> <value>0 0/1 * * * ?</value> </property> </bean> <bean id="taskB2Trigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail"> <ref bean="taskJobB2" /> </property> <property name="cronExpression"> <value>0 0/2 * * * ?</value> </property> </bean> <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="taskA1Trigger" /> <ref bean="taskA2Trigger" /> <ref bean="taskB1Trigger" /> <ref bean="taskB2Trigger" /> </list> </property> </bean> </beans>
注意
トリガーは1つのジョブのみをトリガーできますが、ジョブが実行できる 複数のトリガーがトリガーされているため、同時実行の問題が発生します。 Quartz では、同じジョブを同時に実行したくない場合は、ジョブの代わりに StatefulJob を実装できます。 Spring で MethodInvokingJobDetailFactoryBean を使用する場合、concurrent="false" 属性を設定することでこれを実現できます。
終了ノート
Spring で個別のアプリケーションの代わりに Quartz を使用する利点は次のとおりです:
すべてのタスクのスケジュール設定を同じ場所に置くことで、タスクの保守が容易になります。
ジョブのエンコードのみ、トリガー、およびスケジューラは構成を通じて設定可能
Pojo Java Beanを使用して、ジョブインターフェースを実装せずにジョブを実行可能
Cron式の詳細な使用方法
フィールドで許可される値で許可される特殊文字
秒 0 ~ 59、 - * /
分 0 ~ 59、 - * /
時間 0 ~ 23、 - * /
日付 1 ~ 31、 - * / L W C
月 1 ~ 12 または 1 月 ~ 12 月、 - * /
週 1 ~ 7 または SUN ~ SAT、 - * ? / L C #
年 (オプション) 空白のまま、1970 ~ 2099、 - * /
例:
0/5 * * * * : 毎に実行5 秒
「」文字はすべての値を指定するために使用されます。例: 「」は、分フィールドの「毎分」を意味します。
「?」文字は日付フィールドと曜日フィールドでのみ使用されます。 「非明示的な値」を指定するために使用されます。これは、これら 2 つのフィールドのいずれかに何かを指定する必要がある場合に便利です。以下の例を見れば理解できるでしょう。
日と曜日の 2 つの要素は相互に排他的です。そのフィールドを設定しないことを示すには、疑問符を設定する必要があります。
「-」文字は範囲を指定するために使用されます。たとえば、時間領域の「10-12」は、「10 時、11 時、12 時」を意味します。
「,」文字は追加の値を指定するために使用されます。例: 「MON, WED, FRI」は、曜日フィールドの「月曜日、水曜日、金曜日」を意味します。
「/」文字は増分を指定するために使用されます。例: 秒フィールドの「0/15」は、1 分あたり 0、15、30、45 秒を意味します。分のフィールドの「5/15」は、各時間の 5、20、35、50 を意味します。 「/」の前の記号「」 (/10 など) は、「/」の前の 0 (0/10 など) と同等です。本質を覚えておいてください。式の各数値フィールドは最大値と最小値のセットです。たとえば、秒フィールドと分のフィールドのセットは 0 ~ 59、日付フィールドは 1 ~ 31、月フィールドは 1- です。 12.文字「/」は、各文字フィールドで対応する値を取得するのに役立ちます。例: 「7/6」が月フィールドにある場合、毎年 6 月ではなく、7 月にのみトリガーされます。
L は「last」の略語で、月の日フィールドと曜日フィールドを表すことができますが、2 つのフィールドの意味は異なります。たとえば、月の日フィールドは月の最終日を表します。月。曜日フィールドが「7」または「SAT」を表す場合、曜日フィールドの前に数字が追加されると、その月の最後の数日を表します。たとえば、「6L」は月の最後の数日を表します。月末の金曜日。
文字「W」は日付フィールドにのみ使用できます。この文字は、日付に最も近い営業日を指定するために使用されます。例: 日付フィールドに「15W」と入力すると、今月の 15 日の最も近い営業日を意味します。したがって、15 日が土曜日の場合、タスクは 14 日にトリガーされます。 15 日が日曜日の場合、タスクは 16 日の月曜日にトリガーされます。日付フィールドに「1W」を入力すると、1 日が土曜日であっても、タスクは次の月曜日 (3 日) にのみトリガーされます。「W」文字で指定された最新の稼働日をまたぐことはできません。数か月。文字「W」は単一の値でのみ使用でき、数値フィールドには使用できません。たとえば、1-15W は誤りです。
「L」と「W」は日付フィールドで併用できます。LW は今月の最終週の営業日を表します。
文字「#」は曜日フィールドにのみ使用できます。この文字は、月の特定の日を指定するために使用されます。例: 「6#3」は今月の第 3 週の金曜日を意味します (6 は金曜日、3 は第 3 週を意味します)。 「2#1」は、月の第 1 週の月曜日を意味します。 「4#5」は第5週の水曜日を意味します。
文字「C」は日付フィールドと曜日フィールドに表示できます。この文字は、指定された「カレンダー」に依存します。つまり、この式の値は、関連する「カレンダー」の計算結果に依存します。関連付けられている「カレンダー」がない場合は、含まれるすべての「カレンダー」と同等になります。たとえば、日付フィールドが「5C」の場合、関連付けられた「カレンダー」の最初の日、または今月の最初の日から 5 日後を意味します。週フィールドが「1C」の場合、関連する「カレンダー」の最初の日、または週の最初の日の翌日、つまり日曜日(月曜日)の翌日を意味します。
式の例
"0 0 12 * * ?" 每天中午12点触发 "0 15 10 ? * *" 每天上午10:15触发 "0 15 10 * * ?" 每天上午10:15触发 "0 15 10 * * ? *" 每天上午10:15触发 "0 15 10 * * ? 2005" 2005年的每天上午10:15触发 "0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发 "0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发 "0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发 "0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发 "0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发 "0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发 "0 15 10 15 * ?" 每月15日上午10:15触发 "0 15 10 L * ?" 每月最后一日的上午10:15触发 "0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发 "0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发 "0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发
上記の Spring を統合してスケジュールされたタスクのスケジューリングを実装する方法は、エディターによって共有されたすべての内容です。参考になれば幸いです。また、PHP 中国語 Web サイトをサポートしていただければ幸いです。
Spring が Quartz を統合してスケジュールされたタスクのスケジューリングを実装する方法に関するその他の関連記事については、PHP 中国語 Web サイトに注目してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











一部のアプリケーションが適切に機能しないようにする会社のセキュリティソフトウェアのトラブルシューティングとソリューション。多くの企業は、内部ネットワークセキュリティを確保するためにセキュリティソフトウェアを展開します。 ...

多くのアプリケーションシナリオでソートを実装するために名前を数値に変換するソリューションでは、ユーザーはグループ、特に1つでソートする必要がある場合があります...

システムドッキングでのフィールドマッピング処理は、システムドッキングを実行する際に難しい問題に遭遇することがよくあります。システムのインターフェイスフィールドを効果的にマッピングする方法A ...

intellijideaultimatiateバージョンを使用してスプリングを開始します...

データベース操作にMyBatis-Plusまたはその他のORMフレームワークを使用する場合、エンティティクラスの属性名に基づいてクエリ条件を構築する必要があることがよくあります。あなたが毎回手動で...

Javaオブジェクトと配列の変換:リスクの詳細な議論と鋳造タイプ変換の正しい方法多くのJava初心者は、オブジェクトのアレイへの変換に遭遇します...

Redisキャッシュソリューションは、製品ランキングリストの要件をどのように実現しますか?開発プロセス中に、多くの場合、ランキングの要件に対処する必要があります。

eコマースプラットフォーム上のSKUおよびSPUテーブルの設計の詳細な説明この記事では、eコマースプラットフォームでのSKUとSPUのデータベース設計の問題、特にユーザー定義の販売を扱う方法について説明します。
