Quartz

Quatz

主要用到的设计模式

Builder模式

Factory模式

组件模式

三个核心概念

调度器

任务

触发器

重要组成

重要组成(JOB TRIGGER SCHEDULER)

Job 实现任务

JobDetail Quartz每次执行job的时候都会创建一个job实例

JobBuilder 创建JobDetail实例

JobStore 存储Job数据

Trigger 触发规则

TriggerBuilder

ThreadPool

Scheduler

监听器

​ JobListener

​ TriggerListener

​ SchedulerListener

Job创建

public class HelloJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
  //打印当前执行时间
  SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  Calendar calendar = Calendar.getInstance();
  System.out.println(simpleDateFormat.format(calendar.getTime()));
  //编写具体的业务逻辑
  System.out.println("hello world");
}
}

JobDetail Trigger Scheduler

//withIdentity 定义唯一标识
public class HelloScheduler {
public static void main(String[] args) {
  //创建一个JobDetail实例 将该实例与JelloJob绑定
  //Build模式
  JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
          .withIdentity("myJob", "group1").build();

  //创建一个Trigger实例,定义该Job立即执行 每隔两面重复一次
  Trigger trigger = TriggerBuilder.newTrigger().withIdentity("myTrigger", "group1")
          // 从现在开始执行   执行频度
          .startNow().withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(2).repeatForever()).build();

   // 创建Scheduler 实例 工厂模式
  SchedulerFactory schedulerFactory = new StdSchedulerFactory();
  Scheduler scheduler = schedulerFactory.getScheduler();
  //绑定jobDetail 和 trigger
  scheduler.scheduleJob(jobDetail,trigger);
  scheduler.start();
  System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
}
}

Job 实例在Quartz中的生命周期

每次调度器执行job时候 在调用Execute方法前会创建一个新的job实例

当调用完成以后 关联job实例的对象会被释放 回收

JobDetail为Job实例提供了许多设置属性,以及JobDataMap成员变量属性

它用来存储特定的Job实例状态信息,调度器需要借助JobDetail来添加Job实例

  System.out.println("name:"+jobDetail.getKey().getName());
  System.out.println("group:"+jobDetail.getKey().getGroup());
  System.out.println("jobclass: "+jobDetail.getJobClass().getName());

JobExecutionContext

当Scheduler调用一个Job 就会将JobExecutionContext 传递给Job的Execute方法

Job能通过这个访问到Quartz运行时候的环境以及Job本身的明细数据

JobDataMap

进行任务调度的时候JobDataMap 存储在JobExecutionContext中 非常方便获取

获取JobDataMap

1:从Map中直接获取

JobDetail jobDetail = jobExecutionContext.getJobDetail();
System.out.println(jobDetail.getJobDataMap().get("message"));

//合并dataMap
jobExecutionContext.getMergedJobDataMap();

Job 实现类中添加setter方法对应JobDataMap的键值

//在job实现类中
private String message;
//设置setter方法
xxxxx

Trigger

JobKey

StartTime

EndTime

JobKey

表示Job的实例标识 触发器被触发的时候 该指定的job实例会执行 获取的jobDetail的相关信息

StartTime

首次被触发的时间

EndTime

不在被触发的时间

  Trigger trigger = jobExecutionContext.getTrigger();
		JobKey jobKey = trigger.getJobKey();
  System.out.println("startTime "+trigger.getStartTime());
  System.out.println("endTime "+trigger.getEndTime());

SimpleTrigger

在一个指定时间段内执行一次作业任务

或者是在指定的时间间隔内多次执行作业任务

4秒中之后执行且仅仅执行一次任务

  SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger().withIdentity("myTrigger", "group1")
          .startAt(date).build();

4秒中之后执行一次任务 之后每隔两秒钟执行一次任务

SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger().withIdentity("myTrigger", "group1")
          .startAt(date)             .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(2).withRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY))
          .build();

withRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY) 可以重复的次数 SimpleTrigger.REPEAT_INDEFINITELY 无限次

CronTrigger

基于日历的作业调度器

Cron 表达式

用于配置CronTrigger实例,是由7个子表达式组成的字符串,描述了时间表的详细信息。

格式 【秒】【分】【小时】【日】【月】【周】【年】

CronTrigger trigger = (CronTrigger) TriggerBuilder.newTrigger().withIdentity("myTrigger", "group1")
               //? 代表不考虑
               .withSchedule(CronScheduleBuilder.cronSchedule("* * * * * ? *"))
               .build();

Scheduler 的创建方式

//StdSchedulerFactory
SchedulerFactory schedulerFactory = new StdSchedulerFactory();


//DirectScheduler
DirectSchedulerFactory directSchedulerFactory = DirectSchedulerFactory.getInstance();

主要函数

scheduleJob

返回的是一个Date类型 可以看见下一次执行的时间

start

standby

暂时暂停

shutdown

传入参数 true 表示等待所有正在执行的job执行完毕后 再关闭scheduler

false 直接关闭

关闭 无法再次重启

Quartz.properties

调度器属性

线程池属性

作业存储设置

插件设置

整合Spring

两种方式

MethodInvokingJobDetailFactoryBean 直接配置调用哪个Bean的哪个方法

JobDetailFactoryBean 需要给作业传递数据的时候 Job方法要继承

MethodInvokingJobDetailFactoryBean

   <!--  简单的配置  -->
    <bean id="simpleJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <!--   任务Bean     -->
        <property name="targetObject" ref="myBean"/>
        <!--    任务的方法    -->
        <property name="targetMethod" value="printMessage"/>
    </bean>

JobDetailFactoryBean 需要给作业传递数据的时候 Job方法要继承

    <bean id="firstComplexJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
        <property name="jobClass" value="com.cslg.controller.FirstScheduleJob"/>
        <property name="jobDataAsMap">
            <map>
                <entry key="anotherBean" value-ref="anotherBean"/>
            </map>
        </property>
        <!-- 如果一个任务不是durable,那么当没有Trigger关联它的时候,它就会被自动删除。-->
        <property name="durability" value="true"/>
    </bean>
    <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
        <property name="jobDetail" ref="simpleJobDetail"/>
        <property name="startDelay" value="1000"/>
        <property name="repeatInterval" value="2000"/>
    </bean>

    <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail" ref="simpleJobDetail"/>
        <property name="cronExpression" value="0/5 * * ? * * "/>
    </bean>

    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="jobDetails">
            <list>
                <!--                <ref bean="simpleJobDetail"/>-->
                <ref bean="firstComplexJobDetail"/>
            </list>
        </property>
        <property name="triggers">
            <list>
                <!--                <ref bean="simpleTrigger"/>-->
                <ref bean="cronTrigger"/>
            </list>
        </property>
    </bean>

AnotherBean

@Component("anotherBean")
public class AnotherBean {
    public void printMessage() {
        System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
        System.out.println("another Execute");
    }
}

//FirstScheduleJob
public class FirstScheduleJob extends QuartzJobBean {
    private AnotherBean anotherBean;

    public void setAnotherBean(AnotherBean anotherBean){
        this.anotherBean = anotherBean;
    }

    @Override
    protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
           this.anotherBean.printMessage();
    }
}

整合所需要的jar包

       <dependency>
           <groupId>org.quartz-scheduler</groupId>
           <artifactId>quartz</artifactId>
           <version>2.3.2</version>
       </dependency>

       <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-context-support</artifactId>
           <version>5.2.4.RELEASE</version>
       </dependency>

       <dependency>
           <groupId>org.slf4j</groupId>
           <artifactId>slf4j-nop</artifactId>
           <version>1.7.21</version>
       </dependency>

       <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-context</artifactId>
           <version>5.2.4.RELEASE</version>
       </dependency>

       <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-webmvc</artifactId>
           <version>5.2.4.RELEASE</version>
       </dependency>

       <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-aop</artifactId>
           <version>5.2.4.RELEASE</version>
       </dependency>

       <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-tx</artifactId>
           <version>5.2.4.RELEASE</version>
       </dependency>

       <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-core</artifactId>
           <version>5.2.4.RELEASE</version>
       </dependency>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值