quartz(1)基本使用

quartz:Quartz是一个彻底由Java编写的开源任务调度的框架,经过触发器设置做业定时运行规则,控制做业的运行时间java

一、SimpleTrigger

1.一、引入jar

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

1.二、定义任务类

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

import java.text.SimpleDateFormat;
import java.util.Date;

public class HelloJob implements Job{


    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        //具体的业务逻辑
        SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("hello word"+format.format(new Date()));
    }
}

1.三、建立JobDetail,Striiger,Schedule

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

import java.util.Date;

/**
 * Created by Administrator on 2017/6/23.
 */
public class HelloScheduler {

    public static void main(String[] args) {
        //建立 jobDetail 绑定到 job
        JobDetail jobDetail= JobBuilder.newJob(HelloJob.class).withIdentity("任务名称","任务组") .build();



        //建立trigger  启动任务并在3秒后执行任务  而且只执行一次
        Date startTime=new Date();//任务执行时间点
        startTime.setTime(startTime.getTime()+3000);
        SimpleTrigger trigger= (SimpleTrigger) TriggerBuilder.newTrigger().withIdentity("SimpleTrigger name","SimpleTrigger group")
                .startAt(startTime)
                .build();


        //建立 schedule 实例
        SchedulerFactory schedulerFactory=new StdSchedulerFactory();
        Scheduler scheduler= null;
        try {
            scheduler = schedulerFactory.getScheduler();
            scheduler.start();
            scheduler.scheduleJob(jobDetail,trigger);
        } catch (SchedulerException e) {
            e.printStackTrace();
        }



    }
}

二、CronTrigger

定义job任务实现类,和SimpleTrigger同样。spring

启动任务app

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

/**
 * Created by Administrator on 2017/6/23.
 * 表达式: 秒 分 时 日 月 周 年(可选)
 */
public class HelloCronScheduler {

    public static void main(String[] args) {
        //建立 jobDetail 绑定到 job
        JobDetail jobDetail= JobBuilder.newJob(HelloJob.class).withIdentity("任务名称","任务组").build();

        //建立trigger   每两秒执行一次jobDetail
        CronTrigger trigger= TriggerBuilder.newTrigger().withIdentity("任务触发器name","触发器组name")
                .withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * * * ?"))
                .build();

        //建立 schedule 实例
        SchedulerFactory schedulerFactory=new StdSchedulerFactory();
        Scheduler scheduler= null;
        try {
            scheduler = schedulerFactory.getScheduler();
            scheduler.start();
            scheduler.scheduleJob(jobDetail,trigger);
        } catch (SchedulerException e) {
            e.printStackTrace();
        }



    }
}

三、集成到spring

3.一、引入jar

<quartz.version>2.2.3</quartz.version>
<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>${quartz.version}</version>
</dependency>

3.二、定义任务类

public class JobTest implements Job {
    
    @Autowired
    UserService userService;
    
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("任务执行中");
        System.out.println("userService:"+userService);
    }
}

能够在spring容器启动成功后执行这个任务,在任务类中尝试注入UserService ,可是最后的结果是没法注入。框架

3.三、解决注入问题

在构造方法中从spring容器中去获取须要的beanide

public JobTest() {
        this.userService= SpringContextKit.getBean("userService");
    }

SpringContextKit代码ui

/**
 * 获取spring容器中的组件
 */
@Component
public class SpringContextKit implements ApplicationContextAware {
    private static ApplicationContext context = null;
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.context = applicationContext;
    }

    /**
     *
     * @param beanName 须要在接口实现类上标注 如@Service("userService")
     * @param <T>
     * @return
     */
    public static <T> T getBean(String beanName){
        return (T) context.getBean(beanName);
    }
}

3.四、在spring.xml中配置任务

3.4.一、定义任务类

@Component
public class TaskBean {
    @Autowired
    UserService userService;
    private void executeTask(){
        System.out.println("任务执行中");
        System.out.println("userService:"+userService);
    }
}

经过@Component 注解将任务bean交由spring容器进行管理,那么在此bean中就能够使用容器中的其余bena,好比这里的userService。this

3.4.二、配置spring-quartz.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--jobDetail -->
    <bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="taskBean"/>
        <property name="targetMethod" value="executeTask"/>
        <property name="concurrent" value="false"/>
    </bean>

    <!--jobDetail 触发器 定义任务执行规则-->
    <bean id="trigger1" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail" ref="jobDetail"/>
        <!--每五秒执行一次任务-->
        <property name="cronExpression" value="0/5 * * * * ?"/>
    </bean>


    <!--任务调度-->
    <bean id="schedule" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref bean="trigger1"/>
            </list>
        </property>
        <property name="autoStartup" value="true"/>
    </bean>
</beans>
相关文章
相关标签/搜索