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