序文
タイミングタスク関数は、Spring Bootに実装されています。 Springに付属のタイミングタスクスケジューリングを使用することも、統合されたクラシックオープンソースコンポーネントQuartzを使用してタスクスケジューリングを実現することもできます。
この記事では、Spring Bootでのタイミングされたタスクの実装に関する関連コンテンツを詳細に紹介し、参照と学習のために共有します。以下ではあまり言いません。詳細な紹介を一緒に見てみましょう。
1。スプリングタイマー
1。クロン発現法
組み込みのタイミングタスクを使用することは非常に簡単です。次のような注釈を追加するだけで、通常のタイミングタスクフレームワークのようなタイミング処理インターフェイスを継承する必要はありません。単純な例コードは次のとおりです。
パッケージcom.power.demo.scheduledtask.simple; Import com.power.demo.util.dateTimeutil; Import org.springframework.scheduling.annablescheduling; Import org.springframework.scheduling.annotation.annotation.sceduled; java.util.date;@component@enableSchedulingpublic class springtaska {/** * cron expressionリファレンス:http://cron.qqe2.com/ **/@scheduled(cron = " */5 * * *?"、ゾーン= "gmt+8:00")prive void timercron. } catch(Exception e){e.printstacktrace(); } system.out.println(string.format( "(timercron)%s 5秒ごとに実行、ロギング"、datetimeutil.fmtdate(new date()))); }} Springtaska上記のコードでは、@EnablesChedulingアノテーションをクラスに追加し、メソッドに@Scheduledを追加し、Cron式を構成すると、最も単純なCronタイミングタスクが完了します。以下は、クロン式のコンポーネントです。
@scheduled(cron = "[秒] [数分] [hours of month] [月] [曜日] [年] [年]")
2。固定レートとfixeddelay
@scheduled AnnotationはCronの発現を排除し、固定レートやfixeddelayなどの他の構成方法があります。次の例では、さまざまな構成方法を使用して、さまざまな形式のタイミングタスクスケジューリングを実装しています。例コードは次のとおりです。
パッケージcom.power.demo.scheduledtask.simple; Import com.power.demo.util.dateTimeutil; Import org.springframework.scheduling.annablescheduling; Import org.springframework.scheduling.annotation.annotation.sceduled; java.util.date;@component@enableSchedulingpublic class springtaskb { /*sixtrate:最後のタイムポイント後に5秒後に再び実行* / @scheduled(sixedrate = 5000)public void timerfixedrate(){try {try.sleep(100); } catch(Exception e){e.printstacktrace(); } system.out.println(string.format( "(sixtrate)current time:%s"、datetimeutil.fmtdate(new date()))); } /*fixeddelay:最後の実行時点の5秒後に実行* / @scheduled(sixeddelay = 5000)public void timerfixeddelay(){try {shood.sleep(100); } catch(Exception e){e.printstacktrace(); } system.out.println(string.format( "(sixtdelay)現在の時刻:%s"、datetimeutil.fmtdate(new date()))); } /*最初の遅延が2秒後に実行され、sixeddelayルールに従って5秒ごとに実行* / @scheduled(hirtingdelay = 2000、sixeddelay = 5000)public void timerinitdelay(){try {thread.sleep(100); } catch(Exception e){e.printstacktrace(); } system.out.println(string.format( "(initdelay)現在の時刻:%s"、datetimeutil.fmtdate(new date()))); }} springtaskb主な違いに注意してください:
@Scheduled(fixedRate = 5000) :実行の最後のタイムポイントの5秒後にもう一度実行
@Scheduled(fixedDelay = 5000) :最後の実行時点の5秒後に再び実行する
@Scheduled(initialDelay=2000, fixedDelay=5000) :最初の遅延が2秒後に実行してから、5秒ごとに実行するために固定デレイルールを押してください
スケジュールされたタスクが構成された直後に多くのプロジェクトを構成および実行する必要があり、InitialDelayが必要ない場合があります。
3。ゾーン
@Scheduled Annotationには、タイムゾーンを示すおなじみの属性ゾーンもあります。通常、書かれていない場合、タイミングタスクはサーバーのデフォルトタイムゾーンを使用します。タスクが特定のタイムゾーンと特定の時点で実行したい場合、たとえば、一般的な多言語システムがスクリプトを実行して定期的にデータを更新する場合がある場合は、East Eighth Zoneなどのタイムゾーンを設定できます。
zone = "GMT+8:00"
2。クォーツ
Quartzは、最も広く使用されているオープンソースタスクスケジューリングフレームワークの1つであり、多くの企業がそれに基づいて独自のタイミングタスク管理システムを実装しています。 Quartzは、最も一般的に使用される2つのタイミングタスクトリガー、つまりSimpletriggerとCrontriggerを提供します。この記事では、最も広く使用されているcrontriggerを例として取り上げます。
1.依存関係を追加します
<Dependency> GroupId> org.quartz-scheduler </groupid> <artifactid> Quartz </artifactid> <バージョン> 2.3.0 </version> </dependency>
2。クロン式を構成します
サンプルコードに必要な場合は、次の構成をApplication.Propertiesファイルに追加します。
## Quartzの時刻取得ジョブ構成job.taska.cron = */3 * * * * *?job.taskb.cron = */7 * * *?job.taskmail.cron = */5 * * * * * * * * * * * * * * * * * * * * * * *?
実際、コードに記述するか、DBに保持してから、構成せずに読み取ることができます。
3.実装するタイミングのタスクを追加します
タスク1:
パッケージcom.power.demo.scheduledtask.quartz; Import com.power.demo.util.dateTimeutil; Import org.quartz.disallowconcurrentexecution; Import org.quartz.job; Import org.quartz.jobexecutioncontext; importz.jobexexcection; java.util.date; @disallowconcurrentexecutionpublic class quartztaskaはジョブ{@override public void execute(jobexecutioncontext var1)jobexecutionexceptionをスローします{try {thread.sleep(1); } catch(Exception e){e.printstacktrace(); } system.out.println(string.format( "(quartztaska)%s 3秒ごとに実行、log log"、datetimeutil.fmtdate(new date()))); }} Quartztaskaタスク2:
パッケージcom.power.demo.scheduledtask.quartz; Import com.power.demo.util.dateTimeutil; Import org.quartz.disallowconcurrentexecution; Import org.quartz.job; Import org.quartz.jobexecutioncontext; importz.jobexexcection; java.util.date; @disallowconcurrentexecutionpublic class quartztaskb explention job {@override public void execute(jobexecutioncontext var1)jobexecutionexceptionをスロー} catch(Exception e){e.printstacktrace(); } system.out.println(string.format( "(quartztaskb)%s 7秒ごとに実行、log log"、datetimeutil.fmtdate(new date()))); }} quartztaskb電子メールタスクをタイムリーに送信:
パッケージcom.power.demo.scheduledtask.quartz; Import com.power.demo.service.contract.mailservice; Import com.power.demo.util.datetimeutil; import com.power.demo.util.powerlogger; import org.joda.time.datemy; org.quartz.disallowconcurrentexecution; Import org.quartz.job; Import org.quartz.jobexecutioncontext; Import org.quartz.jobexecutionexception; Import org.springframework.beans.factory.Annotation.Autowired; java.util.util.til.til.til.til.til.til.til.til.datepurcunowcunectowired; MailSendTaskはJobを実装しています{@autowired private mailservice mailservice; @Override public void execute(jobexecutioncontext var1)throws jobexecutionexception {system.out.println( "(mailsendtask)%s 5秒ごとにメールを送信する"、datetimeutil.fmtdate(new Date()))); try {//thread.sleep(1); DateTime dtnow = new DateTime(new Date());日付開始時刻= dtnow.minusmonths(1).todate(); // 1か月前の日付Endtime = dtnow.plusdays(1).todate(); mailservice.autosend(starttime、endtime); PowerLogger.info(String.Format( "メールを送信、sind time:%s、end end time:%s"、datetimeutil.fmtdate(starttime)、datetimeutil.fmtdate(endtime))); } catch(Exception e){e.printstacktrace(); PowerLogger.info(String.Format( "メールを送信、例外が発生する:%s、終了時間:%s"、e)); }}} mailsendtaskタスクの実装は非常にシンプルに見え、Quartzのジョブインターフェイスを継承し、実行方法を書き直します。
4.クォーツタイミングタスクを統合します
springにQuartzタイミングタスクインスタンスの初期化を自動的に認識する方法は?これには、スプリングマネージドビーンズを参照し、必要な豆をスプリングコンテナに露出させ、ジョブファクトリーを定義して自動的に注入する必要があります。
まず、スプリング注入済みのジョブファクトリークラスを追加します。
パッケージcom.power.demo.scheduledtask.quartz.config; Import org.quartz.spi.triggerfiredbundle; Import org.springframework.beans.factory.config.autowirecapablebeanfactory; Import org.springframework.context.context.Applicationcontext; org.springframework.applicationcontextaware; Import org.springframework.scheduling.quartz.springbeanjobfactory;パブリックファイナルクラスのautoweanjobactorys extends Springbeanjobfactoryは、アプリケーションを実装しています。 /*** Springは、ApplicationContextAwareインターフェイスのApproachContextAwareインターフェイスを取得できるメカニズムを提供します。インターフェイス、 *豆が属するコンテキストを渡します。 **/ @Override public void setApplicationContext(final ApplicationContext Context){beanFactory = Context.GetAutowireCapableBeanFactory(); } @OverrideプロテクションオブジェクトCreateJobinStance(最終TriggerFiredBundleバンドル)スロー例外{最終オブジェクトジョブ= super.createjobinstance(bundle); beanfactory.autowirebean(job);仕事を返す; }} autowirebeanjobfactoryQuartzConfigを定義する:
パッケージcom.power.demo.scheduledtask.quartz.config; Import org.springframework.beans.factory.annotation.autowired; Import org.springframework.factory.annotation.Annotation.Qualifier; Import org.springframework.context.annotation.Annotation.Buean; springframework.context.annotation.configuration; Import org.springframework.quartz.quartz.crontriggerfactorybean; Import org.springframework.scheduling.quartz.schedulerfactorybean; @Qualifier( "Quartztaskatrigger")private crontriggerfactorybean quartztaskatrigger; @autowired @qualifier( "quartztaskbtrigger")private crontriggerfactorybean quartztaskbtrigger; @autowired @qualifier( "mailsendtrigger")private crontriggerfactorybean mailsendtrigger; // Quartzのジョブは、スプリングコンテナでホストされたオブジェクトを自動的に注入します@bean public autowirebeanjobfactory autowiringspringbeanjobfactory(){return new autowirebeanjobfactory(); } @bean public schedulerfactorybean schedulerfactorybean(){schedulerfactorybean scheduler = new SchedulerFactoryBean(); Scheduler.setJobFactory(autowiringspringbeanjobfactory()); // springによって注入されたジョブクラスの構成リターンスケジューラ。 }} QuartzConfig次に、ジョブの詳細を構成します。
パッケージcom.power.demo.scheduledtask.quartz.config; Import com.power.demo.util.configutil; Import com.power.demo.demo.demo.scheduledtask.quartz.mailsendtask; import com.power.demo.demo.scheduledtask.quartz.quartztaska; Import; com.power.demo.scheduledtask.quartz.quartztaskb; Import com.power.demo.util.configutil; Import org.springframework.context.annotation; import org.springframework.context.annotation.Configuration; Import; org.springframework.scheduling.quartz.crontriggerfactorybean; Import org.springframework.scheduling.quartz.jobdetailfactorybean; @configurationpublic tasksetting {@bean(name = "quartztasa" jobdetail jobdetailfactorybean factory = new jobdetailfactorybean(); Factory.setjobclass(Quartztaska.class); //対応するジョブファクトリーを設定します。SetGroup( "QuartzTaskGroup"); Factory.setName( "quartztaskajob"); Factory.setDurability(false); Factory.setDescription( "Test Task A");ファクトリーを返します。 } @bean(name = "Quartztaskatrigger")public crontriggerfactorybean crontriggerafactorybean(){string cron = configutil.getConfigval(appfield.job_taska_cron); crontriggerfactorybean stfactory = new crontriggerfactorybean(); // jobdetail stactory.setjobdetail(jobdetailafactorybean()。getobject()); stfactory.setstartdelay(1000); stfactory.setname( "quartztaskatrigger"); stfactory.setgroup( "quartztaskgroup"); stfactory.setcronexpression(cron); stactoryを返します。 } @bean(name = "quartztaskb")public jobdetailfactorybean jobdetailbfactorybean(){// jobdetail jobdetailfactorybean factory = new jobdetailfactorybean(); Factory.setjobclass(Quartztaskb.class); //対応するジョブファクトリーを設定します。SetGroup( "QuartzTaskGroup"); Factory.setName( "Quartztaskbjob"); Factory.setDurability(false); Factory.setDescription( "Test Task B");ファクトリーを返します。 } @bean(name = "Quartztaskbtrigger")public crontriggerfactorybean crontriggerbfactorybean(){string cron = configutil.getConfigval(appfield.job_taskb_cron); crontriggerfactorybean stfactory = new crontriggerfactorybean(); // jobdetail stactory.setjobdetail(jobdetailbfactorybean()。getobject()); stfactory.setstartdelay(1000); stfactory.setname( "quartztaskbtrigger"); stfactory.setgroup( "quartztaskgroup"); stfactory.setcronexpression(cron); stactoryを返します。 } @bean(name = "mailsendtask")public jobdetailfactorybean jobdetailmailfactorybean(){// jobdetail jobdetailfactorybean factory = new jobdetailfactorybean(); Factory.setJobClass(MailSendTask.Class); //対応するジョブファクトリーを設定します。SetGroup( "QuartzTaskGroup"); Factory.setName( "mailsendtaskjob"); Factory.setDurability(false); Factory.setDescription( "MailSendTrigger");ファクトリーを返します。 } @bean(name = "mailsendtrigger")public crontriggerfactorybean crontriggermailfactorybean(){string cron = configutil.getConfigval(appfield.job_taskmail_cron); crontriggerfactorybean stfactory = new crontriggerfactorybean(); // jobdetail stactory.setjobdetail(jobdetailmailfactorybean()。getobject()); stfactory.setstartdelay(1000); stfactory.setname( "mailsendtrigger"); stfactory.setgroup( "quartztaskgroup"); stfactory.setcronexpression(cron); stactoryを返します。 }}タスクセット最後に、スプリングブートタイミングタスクアプリケーションを開始すると、Quartzスケジュールに基づく完全なタイミングタスクが実装されます。
この時限タスクの例では、タイム付きメール送信タスクメールセントスクがあります。次の記事では、MongoDBをストレージ媒体として使用して、Spring BootアプリケーションのSimple Mail Systemを共有します。
拡張読書:
多くの企業には、フレームワークとシステムのタイミング付きタスクスケジューリングがあります。 Spring BootにQuartzクラスターを統合して、動的タイミングのタスク構成を実装する方法は?
参照:
//www.vevb.com/article/139591.htm
//www.vevb.com/article/139597.htm
要約します
上記は、この記事のコンテンツ全体です。この記事の内容には、すべての人の研究や仕事に特定の参照値があることを願っています。ご質問がある場合は、メッセージを残してコミュニケーションをとることができます。 wulin.comへのご支援ありがとうございます。