quartz(1)基本使用

本文详细介绍Quartz任务调度框架的使用方法,包括SimpleTrigger和CronTrigger的配置及示例代码,同时探讨如何在Spring环境中集成Quartz,并解决依赖注入问题。

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

1、SimpleTrigger

1.1、引入jar

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

1.2、定义任务类

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.3、创建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();
        }



    }
}

2、CronTrigger

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

启动任务

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();
        }



    }
}

3、集成到spring

3.1、引入jar

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

3.2、定义任务类

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.3、解决注入问题

在构造方法中从spring容器中去获取需要的bean

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

SpringContextKit代码

/**
 * 获取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.4、在spring.xml中配置任务

3.4.1、定义任务类

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

通过@Component 注解将任务bean交由spring容器进行管理,那么在此bean中就可以使用容器中的其他bena,比如这里的userService。

3.4.2、配置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>

 

 

转载于:https://my.oschina.net/u/1993676/blog/1031084

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值