Spring应用之ScheduleTask

cronExpression

字段 允许值 允许的特殊字符
0-59 - * /
0-59 - * /
小时 0-23 - * /
日期 1-31 - * ? / L W C
月份 1-12 或者 JAN-DEC - * /
星期 1-7 或者 SUN-SAT - * ? / L C #
年(可选) 留空, 1970-2099 - * /

说明:

字符 说明 举例
* 用来指定所有的值 "*"在分钟的字段域里表示“每分钟”
? 通过设置一个问号来表明不想设置那个字段 (只在日期域和星期域中使用) 月份中的日期和星期中的日期这两个元素互斥时设置“?”
- 用来指定一个范围 10-12”在小时域意味着“10点、11点、12点”
, 指定多个值 “MON,WED,FRI”在星期域里表示”星期一、星期三、星期五”
/ 指定增量(起始值/增量值) “0/15”在秒域:每分钟的0,15,30和45秒
“5/15”在分钟域:每小时的5,20,35和50
# 指定本月的某某天(只在星期域中出现) “6#3”:本月第三周的星期五(6表示星期五,3表示第三周)
L Last (在日期或星期域中) L在日期域: 一个月的最后一天
L在星期域:‘7’或者‘SAT’
6L在星期域:一个月的最后一个星期五
W Workday: 指定日期的最近工作日(只在日期域出现,且最近工作日是不能够跨月份的) 15W:这个月15号最近的工作日
如果15号是周六,则任务会在14号触发。如果15好是周日,则任务会在周一也就是16号触发
LW: 这个月最后一周的工作日
C Calendar: 某域的几天 (只在日期域和星期域中使用) /

表达式举例:

  • 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:10和2: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触发

Sample

<!-- 加入task命名空间-->
<beans xmlns="http://www.springframework.org/schema/beans"
        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:context="http://www.springframework.org/schema/context"
        xmlns:jaxws="http://cxf.apache.org/jaxws"
        xmlns:cxf="http://cxf.apache.org/core"
        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/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://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
            http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd
            http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd">

<task:annotation-driven/>

<!-- Schedule Task  -->
<bean id="smsDailyMessageTask" class="com.cj.sms.task.SmsDailyMessageTask"/>
<bean id="smsBackTask" class="com.cj.sms.task.SmsBackTask"/>
<task:scheduled-tasks>
    <task:scheduled ref="smsDailyMessageTask" method="insertDailyMessage" cron="0 35 14 * * ?"/>
    <task:scheduled ref="smsBackTask" method="alarmWarning" cron="0 0/30 * * * ?"/>
    <task:scheduled ref="smsBackTask" method="alarmThreadState" cron="0 0/20 * * * ?"  />
</task:scheduled-tasks>

<!-- 通过AOP,可为task加入一些处理 -->
<bean id="myScheduleTaskHandler" class="com.cj.common.MyScheduleTaskHandler">
    <property name="key" value="${deploy.hostname}"/>
    <property name="isCheck" value="${deploy.hostname.check}"/>
</bean>
<aop:config>
    <aop:aspect ref="myScheduleTaskHandler">
        <aop:pointcut expression="execution(public void com.cj.sms.task.*.start*())" id="myTaskInterceptor"/>
        <aop:around method="aroundAdvice" pointcut-ref="myTaskInterceptor" />
    </aop:aspect>
</aop:config>
public class SmsDailyMessageTask{
    public void insertDailyMessage()
    {...}
}
public class SmsBackTask{
    public void alarmWarning()
    {...}
    public void alarmThreadState()
    {...}
}
public class MyScheduleTaskHandler
{
    static Logger logger = Logger.getLogger(MyScheduleTaskHandler.class);

    private String key;
    public String getKey(){return key;}
    public void setKey(String key){this.key = key;}

    private Boolean isCheck;
    public Boolean getIsCheck(){return isCheck;}
    public void setIsCheck(Boolean isCheck){this.isCheck = isCheck;}

    public Object aroundAdvice(final ProceedingJoinPoint pjp) throws Throwable {
        if(!this.isCheck)
            return pjp.proceed();
        try{
            InetAddress netAddress= InetAddress.getLocalHost();
            String hostName=netAddress.getHostName();
            if(hostName!=null && hostName.equals(key)){
                System.out.println("Do Schedule Task---");
                return pjp.proceed();
            }
        }catch(UnknownHostException ex){
            logger.error("Get HostName Error:"+ex.getMessage());
        }
        return null;
    }
}