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タスククラスとして指定してください.
    <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注でクラスに表示してもいいです.これでという定義は不要です.    2、上記のように配置することができます.    3、下の書き方をそのまま使う.
    <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にスキャンさせます.    そしてという構成を加えて、Springに@Schduled注釈を識別させます.    OK、設定完了.もっと拡大したいなら、次のようにします.
    <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スレッド池を便利にして実行してください.