SpringBootの出現は私たちに多くの利便性をもたらしている、あなたは基本的にすべてのアノテーションベースの設定を取り除くことができますが、その急速な反復のため、関連文書が追いついていないこと、私たちはピット上のステップに必要な多くは、次のことが紹介されていますクォーツドッキングミッションのSpinigboot2.0バージョン。
まず、春の一般的なタスクフレームワークで見てみましょう:
1.Springスケジュール
2.Quartz
春のスケジュールは、 Springフレームワークが付属していたタスクは、単に彼はクォーツの簡易版であると言うことですが、それはSpringbootと非常にシンプルな統合を持っているので、
@SpringBootApplication @ComponentScan(basePackages = { "com.hik.tool" 、"com.hik.dealexcel" }) @EnableCaching @EnableScheduling パブリッククラス ProjectApplicationは延び SpringBootServletInitializer { 公共の静的な無効メイン(文字列[]引数){ SpringApplicationを。実行(ProjectApplication。クラス、引数); } }
唯一のクラスspringbootの開始に追加する必要があります
@EnableScheduling
そして、タスクの実行クラスがcronタスクが式を行っている時間を表し書きます
@Component パブリッククラス ScheduledTask { @Scheduled(クーロン = "0 11 15 * * *" ) 公共ボイドreportCurrentTimeCronは()スロー InterruptedExceptionある{ システム。アウト .println("任务执行!"); } }
これは他のパッケージに依存しない、シンプルなタイミングタスクで行うことができ、任意の設定を必要としない、ではない非常にシンプルですが、それのタイミングは、ブログの兄によると、問題がある、と彼は言ったタスク一度の実行中に例外がスローされ、タイマー終了のライフサイクル全体では、将来は再びタスクタイマーを実行することはありませんが、私は水晶を選んだので、ないと同じクォーツ最後のタスクエラーは、次のタスクの実行には影響しませんその後、我々は今日のトピックに入るようになりました。
springboot 2.0前に、まだ石英のスターターので、統合であること、比較的トラブルスポットが、複数のJARパッケージを導入する必要があり、次に設定を行うが、2.0、スタータの導入のみであることができる、以下の工程(石英に関連していること使用量がメモリ版とデータベースのバージョンに分けられ、ここでは主メモリ版で、設定ファイル内のデータベース・アプリケーションのバージョンに直接切り替える方法について話している公式文書をspringboot、すでにデータベース構成情報、以前よりもはるかに簡単な非スターターの全体的な使用):
1.導入スターター
<依存性> <のgroupId> org.springframework.boot </のgroupId> <たartifactId>ばねブートスタータ石英</たartifactId> </依存>
2.書き込み実装excuteInternal方法は、方法は、独自の定期的な実装を作成する必要があるタスククラスの継承QuartzJobBeanクラス
パブリッククラス UploadTaskは拡張 QuartzJobBean { @Resource プライベート TencentYunService tencentYunServiceを。 @Overrideは ボイド保護executeInternal(JobExecutionContext jobExecutionContext)がスロー JobExecutionException { システム。アウト .println("任务开始"); してみてください { 通します。スリープ(6000); } キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } システム。 OUTの .println( "タスクの終了") ; } }
3.構成カテゴリ、クラスやトリガーした特定のタスクをルールを作成し、我々は、対応するXML設定の前に一緒にすることができます
uploadTaskDetailは、特定のクラスを実行するために必要を指定しますが、特定の方法は、私たちが達成するために必要なことをexcuteInternalを
ルールの発火を指定uploadTaskTrigger
@Configuration public class QuartzConfig { @Bean public JobDetail uploadTaskDetail() { return JobBuilder.newJob(UploadTask.class).withIdentity("uploadTask").storeDurably().build(); } @Bean public Trigger uploadTaskTrigger() { CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("*/5 * * * * ?"); return TriggerBuilder.newTrigger().forJob(uploadTaskDetail()) .withIdentity("uploadTask") .withSchedule(scheduleBuilder) .build(); } }
<bean id="cleanupStatusTaskMethod" class= "org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="cleanupStatusTask"/> <property name="targetMethod" value="cleanupStatus"/> <property name="concurrent" value="false"/> </bean> <bean id="cleanupStatusTrigger" class= "org.springframework.scheduling.quartz.SimpleTriggerBean"> <property name="jobDetail" ref="cleanupStatusTaskMethod"/> <property name="startDelay" value="300000"/> <property name="repeatInterval" value="60000"/> </bean>
如此一个Quartz集成Springboot就完成了,是不是很简单,在集成的过程中遇到了一个坑,我们看到在xml配置时我们配置了concurrent为false,这个意思是是否并发执行,系统默认为true,即第一个任务还未执行完整,第二个任务如果到了执行时间,则会立马开启新线程执行任务,这样如果我们是从数据库读取信息,两次重复读取可能出现重复执行任务的情况,所以我们需要将这个值设置为false,这样第二个任务会往后推迟,只有在第一个任务执行完成后才会执行第二个任务。
我们只需要在任务类上加入disallowconcurrentExeution就可以了
@DisallowConcurrentExecution public class UploadTask extends QuartzJobBean { @Resource private TencentYunService tencentYunService; @Override protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException { System.out.println("任务开始"); try { Thread.sleep(6000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("任务结束"); } }
我们可以看一下效果,我们规定了任务每5s执行一次,而线程等待6秒,如果是并发执行会导致任务开始和任务结束杂乱出现
但是如果我们加上如上注解,那么只会成对先后出现开始和结束
这里只是简单讲解了一下quartz和springboot的集成方法,还有很多内容我们可以去探索,例如job间参数传递,可以使用上述job的biulderd的usingJobData等,以上就是全部内容,如果有不当的地方请帮忙指正,谢谢!