Spring QuartzとSpring Taskをまとめました.
SpringはQuartzをカプセル化し、Spring自身もタスクタイマーを提供しています.まとめてみます. Quartzに対しては,主に二つの面を重視して使っています.一つはタイミングタスクの業務であり,もう一つはCron表現です.タイミングタスクは具体的な業務と関連しています.これは言うまでもなく、ここでは表現の意味と書き方だけを説明します. Cron表現は以下の7つのフィールドを含み、順序を区別します.秒0-59、0-59、時間0-23、月内日付は1-12またはJAN-DEC、週内日付は1-7またはSUN-AT、年(オプションフィールド)は空欄または1970-2099で、特殊文字で特殊な意味を表します.具体的には以下の通りです. 斜線(/)の文字は増分値を表します.例えば、秒フィールドの「5/15」は、5秒目から15秒ごとに1回始まることを表します. 疑問符(?)文字とアルファベットL文字は、月の日付と週の日付フィールドでのみ使用できます.疑問符はこのフィールドに具体的な値が含まれていないことを示しています.したがって、月内の日付を指定すると、週内の日付フィールドに「?」を挿入しても良いです.ここには卵痛の設定があります.Quartzではなく、Spring統合Quartzの後、日付(1-31)と曜日(SUN-AT)の両方には疑問符(?)が必要です.システムが起動する時、Springは式をチェックします.もしこの規則に合わないと、異常を投げます.使う時はこの場所に注意してください.これはLinuxでCronを実行するのにはこの制限がありません. アルファベットL文字はlastの略語です.月の日付フィールドに置いて、その月の最後の日に実行する予定です.週間内の日付フィールドにおいて、「L」が単独で存在すると「7」に等しくなります.さもなければ、その月の日付の最後の例を表します.ですから、「0 L」は当月の最後の日曜日に実施するという意味です. アルファベット(W)の文字は指定された値に最も近い平日に実行します.「1 W」を月内日付フィールドに置き、実行を当月の最初の勤務日内にすることを示します. 井号(⻠)の文字は、所与の月に指定された具体的な平日の例です.「MON铉2」を週間内の日付フィールドに置き、タスクを当月の第二月曜日に配置することを示します. アスタリスク(*)の文字は、フィールドが任意の可能な値、表現例を受け入れることができることを示しています. 例: 「0 0 08*?」毎日午前8時にトリガします. 「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/5 14*?」は毎日午後2時から午後2時55分の間に5分間ごとにトリガします. 「0/5 14,18*?」は毎日午後2時から2時55分までと午後6時から6時55分の間に5分間ごとにトリガします. 「0-5 14*?」は毎日午後2時から午後2時05分の間に1分間ごとにトリガします. 「0 10,44 14?3 WED」は毎年3月の水曜日の午後2時10分と2時44分にトリガされます. 「0 15?10?*MON-FRI」は月曜日から金曜日までの午前10時15分にトリガされます. 毎月15日午前10時15分トリガ 毎月最後の日の午前10時15分トリガ 「0 15 10?*6 L」毎月最後の金曜日午前10時15分トリガ “0 15 10?*6 L 2009-2019”2009年から2019年までの毎月最後の金曜日の午前10時15分にトリガします. 毎月の第三金曜日午前10時15分トリガ
Spring Quartzを使ってJobタスクを実現するには二つの方法があります.一つはorg.springframe ork.scheduling.quartz.QuartzJobBenを継承することです.これはおすすめしません.もう一つは継承が必要ではなく、設定ファイルでorg.springframe ebork.scheduling.quartz.MethodInvoking JobDetail FactoryBenを定義し、それのtarg Object属性をJobタスククラスとして指定してください.という定義は不要です. 2、上記のように配置することができます. 3、下の書き方をそのまま使う.
注釈の設定
そして、タイミングタスクに@Componentコメントを追加し、タスク方法に@Schduled(cron="0/5***?")を追加して、Springにスキャンさせます. そしてという構成を加えて、Springに@Schduled注釈を識別させます. OK、設定完了.もっと拡大したいなら、次のようにします.
タイミングタスクは3回実行されています.スレッド名はschedulerをプレフィックスとしています.これはすでに「task:scheduler id=「scheduler」pool-size=「5」/」という構成でidをschedulerと定義した結果です.3回のタスク実行は、私たちが設定したタスクスケジュールスレッドのサイズが5なので、この8つのタスクを5つのインスタンスだけで処理し、その結果から見ると、毎回5つのインスタンスがすべて使用されるわけではない.このpool-sizeの大きさは、システム中のタイミングタスクが多すぎるなら、少し大きくして、以前に定義されていたexectorスレッド池を便利にして実行してください.
Spring Quartzを使ってJobタスクを実現するには二つの方法があります.一つはorg.springframe ork.scheduling.quartz.QuartzJobBenを継承することです.これはおすすめしません.もう一つは継承が必要ではなく、設定ファイルでorg.springframe ebork.scheduling.quartz.MethodInvoking JobDetail FactoryBenを定義し、それのtarg Object属性をJobタスククラスとして指定してください.
<bean id="dealAppointmentTestTask"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<bean class="com.nesec.task.SpringTaskController" />
</property>
<property name="targetMethod">
<value>task1</value>
</property>
<property name="concurrent" value="false" />
</bean>
<bean id="job" class=" xx.xx.xx.Job" />
ターゲットObject属性で指定されたタスククラスは、様々な方法で実装されます. 1、@Component注でクラスに表示してもいいです.これで <property name="targetObject">
<bean class="xx.xx.xx.Job" />
</property>
次にフリップフロップを設定します. <bean id="dealAppointmentTestTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="dealAppointmentTestTask" />
</property>
<!— 5 -->
<property name="cronExpression">
<value>0/5 * * * * ?</value>
</property>
</bean>
最終配置スケジューリング工場 <bean autowire="no"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="dealAppointmentTestTrigger" />
</list>
</property>
</bean>
これで配置全体が完了します.次にSpring-Teaskのタイミングタスクを実現する手順を見ます. Springは3.0から自分のタスクスケジューラを追加し、java.util.co ncurrentパッケージの下のクラスを拡張することによって実現され、Cron表現も使用されます. spring taskを使うのはとても簡単で、まず名前空間schemaを増加します. <beans xmlns="http://www.springframework.org/schema/beans"
......
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="
......
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd">
注釈の設定
そして、タイミングタスクに@Componentコメントを追加し、タスク方法に@Schduled(cron="0/5***?")を追加して、Springにスキャンさせます. そして
<task:executor id="executor" pool-size="5" />
<task:scheduler id="scheduler" pool-size="5" />
<task:annotation-driven executor="executor" scheduler="scheduler" />
タイミングタスクが多い場合は、exectorスレッド池を配置することができます.ここでexectorの意味はjava.util.co ncurrent.Exectorと同じです.schedulerのpool-sizeはScheduledExect rServiceスレッド池で、デフォルトは1です.もし8つのタスクを設定したら、それぞれ5秒ごとに実行します.下のコードをもう7つコピーしてから変更して、印刷結果を見てください. @Scheduled(cron = "0/5 * * * * ?")
public void work1(){
System.out.println(Thread.currentThread().getName()+" "+"work1: 5 ");
}
……タイミングタスクは3回実行されています.スレッド名はschedulerをプレフィックスとしています.これはすでに「task:scheduler id=「scheduler」pool-size=「5」/」という構成でidをschedulerと定義した結果です.3回のタスク実行は、私たちが設定したタスクスケジュールスレッドのサイズが5なので、この8つのタスクを5つのインスタンスだけで処理し、その結果から見ると、毎回5つのインスタンスがすべて使用されるわけではない.このpool-sizeの大きさは、システム中のタイミングタスクが多すぎるなら、少し大きくして、以前に定義されていたexectorスレッド池を便利にして実行してください.