spring+quartz定时任务调度

导读

本文讲述的是spring+quartz环境下的定时任务调度,不涉及动态。动态定时调度将会放在另一篇文章中(未编辑)。

环境:

spring4.x.x+springMVC+mybatis框架+quartz2.2所需Jar包下载地址

1.使用quartz,配置在spring.xml中

定时调度较为简单,只需在配置文件中写好相关的触发器,定时器就好了

<!-- 启动触发器的配置开始 -->  
    <bean name="startQuertz" lazy-init="false" autowire="no"  
        class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
        <property name="triggers">  
            <list>  
                <ref bean="myJobTrigger" />  
                <!-- 在这里添加不同的定时器 -->
            </list>  
        </property>  
    </bean>  
    <!-- 启动触发器的配置结束 -->  

定时器

<!-- quartz-2.x的配置 -->  
    <bean id="myJobTrigger"  
        class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">  
        <property name="jobDetail">  
            <!-- 在这里添加调用的类 -->
            <ref bean="myJobDetail" />  
        </property>  
        <property name="cronExpression">  
            <!-- 定时表达式 ,格式在最后-->
            <value>0/1 * * * * ?</value>  
        </property>  
    </bean>  
    <!-- 调度的配置结束 --> 

被调用的类与方法

<!-- job的配置开始 -->  
    <bean id="myJobDetail"  
        class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">  
        <property name="targetObject">  
            <!-- 被调用的类 -->
            <ref bean="myJob" />  
        </property>  
        <property name="targetMethod">  
            <!-- 调用类中的方法 -->
            <value>work</value>  
        </property>  
        <property name="concurrent" value="false"></property>
    </bean>  
    <!-- job的配置结束 -->  
     <!-- 工作的bean -->  
    <bean id="myJob" class="com.cwj.demo.MyJob" />  

这里会每隔1s执行MyJob下的work方法。

//测试类
public class MyJob {
    public void work() {
        System.out.println("date: " + new Date().getTime());
    }
}

最后在web.xml中加载spring.xml启动服务器就会开始调用work()方法了。
这里写图片描述

2.使用spring自带的定时调度

spring自带有定时调度的方法,并且可以用注解的方式在配置时间表达式。

spring.xml中配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:util="http://www.springframework.org/schema/util"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:task="http://www.springframework.org/schema/task"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
           http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
           http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.2.xsd">
    <!-- 自动扫描包 -->
    <context:component-scan base-package="com.cwj.task"/>
    <task:annotation-driven scheduler="myScheduler"/>
    <!-- 配置线程池 -->
    <task:scheduler id="myScheduler" pool-size="20"/>

</beans>

线程池也可以不配置,那样的话在多任务时,下一个任务必须等上一个运行结束之后才能运行,不能同步。

注解也很简单

package com.cwj.task;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.TimeUnit;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class ATask{
    @Scheduled(cron="0/1 * *  * * ? ")

    public void task() {
        try {  
            TimeUnit.SECONDS.sleep(20);  
        } catch (InterruptedException e) {  
            e.printStackTrace();  
        }  
        DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");    
        System.out.println(sdf.format(new Date())+"*********A任务每1秒执行一次进入测试");
    }

}

@Scheduled(cron=”0/1 * * * * ? “)中直接写入时间表达式就好了。

cronExpression表达式

字段 允许值 允许的特殊字符

秒 0-59 , – * /
分 0-59 , – * /
小时 0-23 , – * /
日期 1-31 , – * ? / L W C
月份 1-12 或者 JAN-DEC , – * /
星期 1-7 或者 SUN-SAT , – * ? / L C #
年(可选) 留空, 1970-2099 , – * /

表达式意义

"0 0 12 * * ?"              每天中午12点触发
"0 15 10 ? * *"             每天上午10:15触发
"0 15 10 * * ?"             每天上午10:15触发
"0 15 10 * * ? *"           每天上午10:15触发
"0 15 10 * * ? 2005"        2005年的每天上午10:15触发
"0 * 14 * * ?"              在每天下午2点到下午2:59期间的每1分钟触发
"0 0/5 14 * * ?"            在每天下午2点到下午2:55期间的每5分钟触发
"0 0/5 14,18 * * ?"         在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
"0 0-5 14 * * ?"            在每天下午2点到下午2:05期间的每1分钟触发
"0 10,44 14 ? 3 WED"        每年三月的星期三的下午2:102:44触发
"0 15 10 ? * MON-FRI"       周一至周五的上午10:15触发
"0 15 10 15 * ?"            每月15日上午10:15触发
"0 15 10 L * ?"             每月最后一日的上午10:15触发
"0 15 10 ? * 6L"            每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6L 2002-2005"  2002年至2005年的每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6#3"           每月的第三个星期五上午10:15触发
0 6 * * *                   每天早上60 */2 * * *                 每两个小时
0 23-7/28 * * *            晚上11点到早上8点之间每两个小时,早上八点
0 11 4 * 1-3                每个月的4号和每个礼拜的礼拜一到礼拜三的早上110 4 1 1 *                   11日早上4
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值