ホームページ Java &#&チュートリアル Spring が Quartz を統合してスケジュールされたタスクのスケジューリングを実装する方法

Spring が Quartz を統合してスケジュールされたタスクのスケジューリングを実装する方法

Feb 07, 2017 pm 03:19 PM

最近のプロジェクトでは、定期的にメンバーポイントを計算したり、サードパーティのインターフェースを呼び出したりするなど、スケジュールされた実行タスクを実装する必要があります。このプロジェクトでは 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 サイトに注目してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

会社のセキュリティソフトウェアはアプリケーションの実行に失敗していますか?それをトラブルシューティングと解決する方法は? 会社のセキュリティソフトウェアはアプリケーションの実行に失敗していますか?それをトラブルシューティングと解決する方法は? Apr 19, 2025 pm 04:51 PM

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

名前を数値に変換してソートを実装し、グループの一貫性を維持するにはどうすればよいですか? 名前を数値に変換してソートを実装し、グループの一貫性を維持するにはどうすればよいですか? Apr 19, 2025 pm 11:30 PM

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

MapsTructを使用したシステムドッキングのフィールドマッピングの問題を簡素化する方法は? MapsTructを使用したシステムドッキングのフィールドマッピングの問題を簡素化する方法は? Apr 19, 2025 pm 06:21 PM

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

Intellijのアイデアは、ログを出力せずにSpring Bootプロジェクトのポート番号をどのように識別しますか? Intellijのアイデアは、ログを出力せずにSpring Bootプロジェクトのポート番号をどのように識別しますか? Apr 19, 2025 pm 11:45 PM

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

エンティティクラス変数名をエレガントに取得して、データベースクエリ条件を構築する方法は? エンティティクラス変数名をエレガントに取得して、データベースクエリ条件を構築する方法は? Apr 19, 2025 pm 11:42 PM

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

Javaオブジェクトを配列に安全に変換する方法は? Javaオブジェクトを配列に安全に変換する方法は? Apr 19, 2025 pm 11:33 PM

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

Redisキャッシュソリューションを使用して、製品ランキングリストの要件を効率的に実現する方法は? Redisキャッシュソリューションを使用して、製品ランキングリストの要件を効率的に実現する方法は? Apr 19, 2025 pm 11:36 PM

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

eコマースプラットフォームSKUおよびSPUデータベースデザイン:ユーザー定義の属性と原因のない製品の両方を考慮する方法は? eコマースプラットフォームSKUおよびSPUデータベースデザイン:ユーザー定義の属性と原因のない製品の両方を考慮する方法は? Apr 19, 2025 pm 11:27 PM

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

See all articles