任务调度quartz(一)quartz在spring中的集成

对于定时器想必大家都应该挺清楚,就像闹钟一样,在某个指定的时间点定时执行。在Java中我们可以使用quartz来定时调度自己的任务,这个框架为我们提供很多比较方便的功能,能够很轻易对我们的任务进行启动、暂停以及运行周期的修改。
任务调度的意义还是挺大的,例如我们可以写一个调度平台来管理和监控自己写的任务,而在这些任务中我们可以写自己想要干的事,比如做个生日提醒啊,只要发现当前是谁的生日,就给自己发个短信或邮件。或者在项目中完成一些特定的数据处理等。这个笔者会在下一篇博客中讲到。
接下来,直入正题。

一、所依赖的jar包

一是会依赖spring相关的包,而是会依赖quartz的包,spring已经对quartz提供了支持。

<!-- quartz任务调度 -->
    <dependency>
      <groupId>fakepath</groupId>
      <artifactId>quartz-all</artifactId>
      <version>2.1.6</version>
    </dependency>
    <dependency>
      <groupId>fakepath</groupId>
      <artifactId>quartz-commonj</artifactId>
      <version>2.1.6</version>
    </dependency>

二、spring的中配置

首先准备两个测试任务类,如下
TestJob.java:

package org.qiyongkang.schedule.quartz.job;

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

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

/**
 * ClassName:TestJob <br/>
 * Function: TODO ADD FUNCTION. <br/>
 * Reason:   TODO ADD REASON. <br/>
 * Date:     2015年12月18日 下午4:37:12 <br/>
 * @author   qiyongkang
 * @version  
 * @since    JDK 1.6
 * @see      
 */
public class TestJob {
    private Logger logger = LogManager.getLogger(TestJob.class.getName());

    public void execute() {
        //获取当前时间
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        logger.info("当前时间:{}", sdf.format(date));
    }
}

TestJob2.java:

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

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

/**
 * ClassName:TestJob2 <br/>
 * Function: TODO ADD FUNCTION. <br/>
 * Reason:   TODO ADD REASON. <br/>
 * Date:     2015年12月21日 下午7:52:27 <br/>
 * @author   qiyongkang
 * @version  
 * @since    JDK 1.6
 * @see      
 */
public class TestJob2 {
private Logger logger = LogManager.getLogger(TestJob2.class.getName());

    public void execute() {
        //获取当前时间
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");

        logger.info("当前时间:{}", sdf.format(date));
    }
}

然后,再来看看在spring中的配置:
spring-timer.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" xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd">
    <!-- Scheduler的配置 -->
    <bean name="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
       <!-- <property name="triggers">  
           <list>  
              <ref bean="testTrigger"/>
              <ref bean="testTrigger2"/>
           </list>  
       </property>   -->
       <property name="autoStartup" value="false"/> <!-- 默认为true -->
    </bean> 

    <!-- Trigger的配置,指定job执行的时间周期 -->
    <bean id="testTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">  
      <property name="jobDetail" ref="testJobDetail"/>  
      <property name="cronExpression" value="*/5 * * * * ?"/><!-- 每隔5秒钟触发一次 -->  
    </bean>
    <bean id="testTrigger2" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">  
      <property name="jobDetail" ref="testJobDetail2"/>  
      <property name="cronExpression" value="*/1 * * * * ?"/><!-- 每隔1秒钟触发一次   -->
    </bean> 

    <!-- JobDetail的配置,指定job的执行类和执行方法 -->
    <bean id="testJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">   
      <property name="targetObject" ref="testJob"/>  
      <property name="targetMethod" value="execute"/>  
      <property name="concurrent" value="true"/>
      <!-- 是否允许任务并发执行。当值为false时,表示必须等到前一个线程处理完毕后才再启一个新的线程 -->  
    </bean>
    <bean id="testJobDetail2" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">   
      <property name="targetObject" ref="testJob2"/>  
      <property name="targetMethod" value="execute"/>  
      <property name="concurrent" value="true"/>
    </bean>

    <!-- 业务类的配置 -->
    <bean id="testJob" class="org.qiyongkang.schedule.quartz.job.TestJob"/>
    <bean id="testJob2" class="org.qiyongkang.schedule.quartz.job.TestJob2"/>
</beans>

这里,我们可以配置web容器启动后自动调度程序,也可以手动进行启动和暂停。

三、启动和暂停

这里,笔者简单的写了这个页面来控制这两个任务的启动和暂停,如下:
这里写图片描述
然后,再来看看springMVC中接受请求的代码:

/**
     * 
     * operateTask:任务的启动或停止. <br/>
     *
     * @author qiyongkang
     * @param taskName
     * @param flag:0->启动,1->停止
     * @return
     * @since JDK 1.6
     */
    @RequestMapping
    @ResponseBody
    public ExtJsObject operateTask(String triggerName, String jobDetailName, Integer flag) {
        ExtJsObject extJsObject = null;
        Scheduler scheduler = startQuertz.getScheduler();

        //获取CronTrigger
        CronTrigger cronTrigger = SpringUtil.getBean(triggerName);

        //获取jobDetail
        JobDetail jobDetail = SpringUtil.getBean(jobDetailName);

        try {
            if (flag == 0) {
                //启动此任务
                scheduler.scheduleJob(jobDetail, cronTrigger);
                if (!scheduler.isStarted()) {
                    scheduler.start();
                }
            } else if (flag == 1) {
                //停止此任务
                scheduler.pauseTrigger(cronTrigger.getKey());
                scheduler.unscheduleJob(cronTrigger.getKey());
                scheduler.deleteJob(jobDetail.getKey());
            }
        } catch (SchedulerException e) {
            e.printStackTrace();
            log.error("触发器启动异常", e);
        }
        return extJsObject;
    }

启动后,控制台的输出如下图:
这里写图片描述
点击暂停后,也可以停止此任务。
好了,就先简单的讲到这儿了,希望对想使用quartz的童鞋有所帮助!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值