本篇博文主要是讲述2.x 版本的quartz下的实现方案,1.x 版本的实现方式大致原理一致,但是具体的实现方式有些不一致,具体体现在获取  scheduler 这个类的方式上有些不同,这里不作过多的描述;

1:java+Quartz实现定时任务:

首先:导入quartz相关的jar包,这里我用的是maven构建的项目,pom.xml文件导入如下:

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

定义要进行定时任务类(该类实现了Quartz 下的job类):

public class MyJob implements Job{

    @Override
    public void execute(JobExecutionContext arg0) throws JobExecutionException {
        // TODO Auto-generated method stub
        System.out.println("开启了定时任务");
        
    }

}

接下来要做的就是按照定时任务的固定步骤来做即可:1:定义调度器并且开启   2:定义任务器  3:定义触发器   4 注册 

具体代码参考如下:

public class QuartzDemo {

    public void quartzTest() throws InterruptedException{
        try {
            //获取调度器
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
            scheduler.start();
            //创建任务器:定义任务细节
            JobDetail jobDetail = JobBuilder.newJob(MyJob.class).withIdentity("job1", "group1").build();
            ScheduleBuilder scheduleBuilder =SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).repeatForever();
            //定义触发器
            Trigger trigger=TriggerBuilder.newTrigger().withIdentity("simpleTrigger", "simpleTriggerGroup")
            .withSchedule(scheduleBuilder).startNow().build();
            
            //将任务和触发器注册到调度器中
            scheduler.scheduleJob(jobDetail, trigger);
            Thread.sleep(1000*30);
//            scheduler.shutdown();
        } catch (SchedulerException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

这里需要将线程睡眠30秒中才能看到定时的效果,不然会代码立马执行完毕,看不到效果;

 

2:spring + quartz 定义定时任务:

spring 管理quartz 有两种方式:

1):自定义的任务类继承特定的基类 QuartzJobBean 

2):自定义的任务类不继承特定的基类  完全就是一个普通的pojo :这种方式的实现主要是spring下的类:org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean

这里只讲述第二种实现方式:

1:定义任务类:

public class QuartzJob {

    private void runJob(){
        System.out.println("开启定时任务!!");
    }
}

2:通过spring配置的方式来定义以下几个步骤:1:定义调度器并且开启   2:定义任务器  3:定义触发器   4 注册 

spring-quartz.xml的配置如下所示:

<!--定义任务器-->
    <bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="quartzJob"/>
        <property name="targetMethod" value="runJob"/>
        <property name="concurrent" value="false"/>
    </bean>
    
    <bean id="quartzJob" class="bz.beppe.javase.QuartzJob"/>
    
    <!--定义触发器-->
    <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
        <!-- see the example of method invoking job above -->
        <property name="jobDetail" ref="jobDetail"/>
        <!-- 10 seconds -->
        <property name="startDelay" value="1000"/>
        <!-- repeat every 50 seconds -->
        <property name="repeatInterval" value="3000"/>
    </bean>
    <!--注册任务器和触发器到schedule中-->
    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <!-- <ref bean="cronTrigger"/> -->
                <ref bean="simpleTrigger"/>
            </list>
        </property>
    </bean>

这里触发器的定义有两种方式:

1:SimpleTriggerBean:

2:CronTriggerBean:

用户可以根据自身的需要来选择相应的触发器;

这里需要注意的是 org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean这个类是在spring-context-support这个包下的,需要引入这个

依赖;配置完了定时spring定时job后,需要注册监听器来监听开启spring-quartz.xml,我这里用的是在web.xml中配置监听项目启动后开启spring-quartz.xml容器;

 

3:spring 自带的定时任务:spring-task:

spring 自身的spring-task 不依赖任何的第三方框架,实现方式也很简单:

这里需要做的就是在xml文件中的引入task命名空间,以便后续标签中的使用:

xmlns:task="http://www.springframework.org/schema/task"
http://www.springframework.org/schema/task 
 http://www.springframework.org/schema/task/spring-task-3.2.xsd

1:定义任务类:

public class TaskJob {

    public void springJob(){
        System.out.println("spring 自身的定时任务");
    }
}

2:在xml配置文件中配置定时job:

<!--配置任务类-->
    <bean id="beanA" class="bz.beppe.javase.TaskJob"></bean>  
    <!--定义触发类和触发方式-->
    <task:scheduled-tasks scheduler="myScheduler">
        <task:scheduled ref="beanA" method="springJob" fixed-rate="5000"/>
    </task:scheduled-tasks>

    <task:scheduler id="myScheduler" pool-size="10"/>

经过这样的配置后在在开启这个定时任务的spring容器后就会开始相应的定时job