SpringBootシリーズ:春ブーツ統合タイミングタスククォーツ

クォーツにまず、

クォーツも単独で使用することができ、それはJ2EEとJ2SEアプリケーションと組み合わせることができますOpenSymphonyのオープンソース組織とジョブスケジューリング分野におけるオープンソースプロジェクトです。Javaエンタープライズ・アプリケーションでは、クォーツは、最も広く使用されているの時限スケジューリングフレームワークです。

クォーツのメインコンセプト:

  • スケジューリングAPIの主なタスク:スケジューラ
  • ScheduleBuilderは:シンプルな実装クラスに、例えば、スケジューラを構築するために使用SimpleScheduleBuilder
  • ジョブ:インタフェースのタスク実行のスケジューリング方法であって、実行されるタスクのタイミング、すなわち
  • 仕事スケジュールされたタスクの例:JobDetail
  • JobBuilder:特定の団体の仕事、JobDetailを構築するための
  • トリガ:コンポーネントを定義する実行計画、実行、すなわちタイミングをスケジューリング
  • TriggerBuilder:トリガーの構築

A、クォーツデモ

SpringBootでは、我々は、石英の依存性を導入する必要があります。

 <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!--quartz定时调度依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

まずここで、単純に現在の時刻を印刷し、すなわち達成QuartzJobBean executeInternal継承設定するクラスQuartzJob1、、、スケジュールされたタスクロジック作成方法、特定のジョブを実行するタイミング・ロジックを定義します。

public class QuartzJob1 extends QuartzJobBean {

    @Override
    protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("QuartzJob1----" + sdf.format(new Date()));
    }

}

関連するタスクQuartzJob1ながらQuartzConfigを作成し、その後、JobDetailを定義し、JobDetailは、JobBuilderによって建てられました。

@Configuration
public class QuartzConfig {

    @Bean
    public JobDetail jobDetail1(){
        return JobBuilder.newJob(QuartzJob1.class).storeDurably().build();
    }
    
}

最後に、我々はSimpleScheduleBuilderスケジューラを構築するためのタイミングスケジュールトリガ、簡単な実装クラスを定義する必要があり、TriggerBuilderは、トリガーを構築するために使用されます

@Configuration
public class QuartzConfig {

    @Bean
    public JobDetail jobDetail1(){
        return JobBuilder.newJob(QuartzJob1.class).storeDurably().build();
    }

    @Bean
    public Trigger trigger1(){
        SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
                .withIntervalInSeconds(1) //每一秒执行一次
                .repeatForever(); //永久重复,一直执行下去
        return TriggerBuilder.newTrigger()
                .forJob(jobDetail1())
                .withSchedule(scheduleBuilder)
                .build();
    }
    
}

このようなクォーツタイミングタスクは完了!

実際には、定義は、以下のタイマータスク2 jobDetail2とトリガ2、例えば、仕事に内部クラスを使用して、ジョブ・クラスを作成するために分配することができます。

@Bean
public JobDetail jobDetail2(){
    QuartzJobBean quartzJob2 = new QuartzJobBean() {
        @Override
        protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
            SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            System.out.println("内部类quartzJob2----" + sdf.format(new Date()));
        }
    };
    return JobBuilder.newJob(quartzJob2.getClass()).storeDurably().build();
}

@Bean
public Trigger trigger2(){
    //JobDetail的bean注入不能省略
    //JobDetail jobDetail3 = JobBuilder.newJob(QuartzJob2.class).storeDurably().build();
    SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
            .withIntervalInSeconds(2) //每2秒执行一次
            .repeatForever(); //永久重复,一直执行下去
    return TriggerBuilder.newTrigger()
            .forJob(jobDetail2())
            .withSchedule(scheduleBuilder).build();
}

プログラムを起動し、我々は、コンソールの出力の時間を見ることができます。

石英は同時にデータの永続性をサポートして、スケジューリング情報のタイミングは、データベースに永続化されてもよいです。

データベースに永続化]を選択し、我々は対応するテーブルを作成する必要があり、table文を内蔵することができクォーツ公式サイトのドキュメント\ dbTablesディレクトリ内の対応するSQLスクリプトを見つけるために、データベース解凍し、ダウンロードします。

便宜上、私はまた、プロジェクト内のソースコードのリソースにファイルを置きます。

データベース操作、我々は関連する依存関係を紹介します。ORMフレームワークは、例えばMyBatisの、休止状態またはJPA場合、それはもはや導入依存JDBCではありません。

<!--mysql连接-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

<!--druid连接池-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.10</version>
</dependency>

<!--jdbc依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

application.yml設定ファイルでは、我々は永続的な方法を石英する宣言します。

server:
  port: 10900

spring:
  profiles:
    active: dev
  quartz:
    job-store-type: jdbc #持久化到数据库
    properties:
      org:
        quartz:
          datasource:
            # 新版驱动从com.mysql.jdbc.Driver变更为com.mysql.cj.jdbc.Driver
            driver-class-name: com.mysql.cj.jdbc.Driver
            # 数据源需要添加时间标准和指定编码格式解决乱码 You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.
            url: jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
            username: root
            password: 1234
          scheduler:
            instancName: clusteredScheduler
            instanceId: AUTO
          jobStore:
            class: org.quartz.impl.jdbcjobstore.JobStoreTX
            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate #StdJDBCDelegate说明支持集群
            tablePrefix: QRTZ_
            isClustered: true
            clusterCheckinInterval: 1000
            useProperties: false
          threadPool:
            class: org.quartz.simpl.SimpleThreadPool
            threadCount: 20
            threadPriority: 5

ここでは、主にジョブストア型である:JDBC、実証プロジェクトは、他のORMのデータソースではなく、その場合、情報は石英ノードの下のデータソースノードで定義されたデータソースが存在するであろうように、データ・ソースであることを、データベースに永続発現すでに存在する、同じプロパティを設定するために使用することができ、もちろん、最も重要なはQuartzDataSource文です。

ここで重要なのは、@QuartzDataSourceであり、このプロジェクトは、すでにデータソースに存在する分離すること。

//Error:EmbeddedDatabaseType class not found,Druid数据源初始化需要引入spring-jdbc依赖,JPA或mybatis依赖已经包含该依赖
@Bean
@QuartzDataSource
@ConfigurationProperties(prefix = "spring.quartz.properties.org.quartz.datasource")
DataSource quartzDataSource(){
    return DruidDataSourceBuilder.create().build();
}

このような持続性は、我々は、起動が完了した後、我々は我々のデータベースは、データの時限スケジューリングされている見ることができ、プロジェクトを再起動し、SQLを実行し、設定されています。

送信元アドレス:https://github.com/imyanger/springboot-project/tree/master/p25-springboot-quartz

おすすめ

転載: www.cnblogs.com/imyanger/p/11828301.html