SpringBoot2.0アクセス石英

SpringBootの出現は私たちに多くの利便性をもたらしている、あなたは基本的にすべてのアノテーションベースの設定を取り除くことができますが、その急速な反復のため、関連文書が追いついていないこと、私たちはピット上のステップに必要な多くは、次のことが紹介されていますクォーツドッキングミッションのSpinigboot2.0バージョン。

まず、春の一般的なタスクフレームワークで見てみましょう:

1.Springスケジュール

2.Quartz

春のスケジュールは、 Springフレームワークが付属していたタスクは、単に彼はクォーツの簡易版であると言うことですが、それはSpringbootと非常にシンプルな統合を持っているので、

@SpringBootApplication
 @ComponentScanbasePackages = { "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等,以上就是全部内容,如果有不当的地方请帮忙指正,谢谢!

发布了6 篇原创文章 · 获赞 13 · 访问量 2万+

おすすめ

転載: blog.csdn.net/tushuping/article/details/79636207