spring注解 @Scheduled(cron = "0 0 1 * * *")的使用来实现定时的执行任务

[java]  view plain  copy
  1. <span style="font-size:14px;">初次接触定时类的小程序,还是走了很多的弯路,如今终于搞定了,总结如下:</span>  
[java]  view plain  copy
  1. <span style="font-size:14px;">import com.activityvip.api.service.SecurityBlockAccountService;  
  2.   
  3. import org.springframework.beans.factory.annotation.Autowired;  
  4. import org.springframework.stereotype.Service;  
  5.   
  6. import javax.annotation.PostConstruct;  
  7. import java.net.InetAddress;  
  8. import java.net.UnknownHostException;  
  9. import java.text.DateFormat;  
  10. import java.text.SimpleDateFormat;  
  11. import java.util.Arrays;  
  12. import java.util.Calendar;  
  13. import java.util.Date;  
  14. import java.util.List;  
  15. import java.util.concurrent.Executors;  
  16. import java.util.concurrent.ScheduledExecutorService;  
  17. import java.util.concurrent.TimeUnit;  
  18.   
  19. import org.springframework.scheduling.annotation.Scheduled;  
  20.   
  21. /** 
  22.  * 
  23.  */  
  24. @Service  
  25. public class SecurityAccountUtil {  
  26.     private static Logger logger = Logger.getLogger(SecurityAccountUtil.class);  
  27.     private static final List<String> localhost = Arrays.asList("emidas-activityvip-web02.nh""emidas-activityvip-web01.beta");  
  28.     @Autowired  
  29.     SecurityBlockService securityBlockService;  
  30.     @Autowired  
  31.     SecurityBlockAccountService securityBlockAccountService;  
  32.     @Autowired  
  33.     SecurityBlockAccountDao securityBlockAccountDao;  
  34.   
  35.     @Scheduled(cron = "0 0 1 * * *")  
  36.     public void run() {  
  37.         if (checkoutHostName()) {  
  38.             try {  
  39.   
  40.                 logger.info("thread is running");  
  41.                 DateFormat dateFormat1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
  42.                 String lastTime = securityBlockAccountService.getLastTime();  
  43.                 Date myDate1 = dateFormat1.parse(lastTime);  
  44.   
  45.                 Date dAfter = getNextDay(myDate1);  
  46.                 Integer numByTime = securityBlockService.getAllNumByTime(myDate1, dAfter);  
  47.                 Integer accountByTime = securityBlockService.getAllAccountByTime(myDate1, dAfter);  
  48.                 securityBlockAccountService.insertAccountNum(numByTime, accountByTime, dAfter);  
  49.   
  50.                 logger.info("thread is end");  
  51.             } catch (Exception e) {  
  52.                 logger.info("SecurityAccountUtil:" + e.getMessage());  
  53.                 e.printStackTrace();  
  54.             }  
  55.         }  
  56.     }  
  57.   
  58.   
  59.     /** 
  60.      * 获取当前时间后一天的时间 
  61.      * 
  62.      * @param date 
  63.      * @return 
  64.      */  
  65.     public static Date getNextDay(Date date) {  
  66.         Calendar calendar = Calendar.getInstance();  
  67.         calendar.setTime(date);  
  68.         calendar.add(Calendar.DAY_OF_MONTH, 1);  
  69.         date = calendar.getTime();  
  70.         return date;  
  71.     }  
  72.   
  73.     /** 
  74.      * 过滤主机名 
  75.      * 
  76.      * @return 
  77.      */  
  78.     protected boolean checkoutHostName() {  
  79.         String hostName = null;  
  80.         try {  
  81.             hostName = InetAddress.getLocalHost().getHostName();  
  82.         } catch (UnknownHostException e) {  
  83.             logger.info(e);  
  84.             hostName = "localhost";  
  85.         }  
  86.   
  87.         return localhost.contains(hostName);  
  88.     }  
  89. }</span>  

最近实习写了一个小小的定时统计的程序,用的是spring的 @Scheduled注解,该注解依赖下面的jar包

[html]  view plain  copy
  1. <span style="font-size:14px;"> <dependency>  
  2.             <groupId>org.springframework</groupId>  
  3.             <artifactId>spring-context</artifactId>  
  4.             <version>3.1.1.RELEASE</version>  
  5.         </dependency></span>  
在使用该注解以前请做好以下准备工作,配置好相应的xm文件。

配置定时注解的步骤:http://blog.csdn.NET/sd4000784/article/details/7745947

下面给出cron参数中各个参数的含义:

CRON表达式    含义 
"0 0 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分每分钟一次触发 
"0 0/5 14 * * ?"    每天从下午2点开始到2:55分结束每5分钟一次触发 
"0 0/5 14,18 * * ?"    每天的下午2点至2:55和6点至6点55分两个时间段内每5分钟一次触发 
"0 0-5 14 * * ?"    每天14:00至14:05每分钟一次触发 
"0 10,44 14 ? 3 WED"    三月的每周三的14:10和14:44触发 
"0 15 10 ? * MON-FRI"    每个周一、周二、周三、周四、周五的10:15触发 


一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素。

按顺序依次为
秒(0~59)

分钟(0~59)

小时(0~23)

天(月)(0~31,但是你需要考虑你月的天数)

月(0~11)

天(星期)(1~7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT)

7.年份(1970-2099)

其中每个元素可以是一个值(如6),一个连续区间(9-12),一个间隔时间(8-18/4)(/表示每隔4小时),一个列表(1,3,5),通配符。由于"月份中的日期"和"星期中的日期"这两个元素互斥的,必须要对其中一个设置?.

0 0 10,14,16 * * ? 每天上午10点,下午2点,4点
0 0/30 9-17 * * ?   朝九晚五工作时间内每半小时
0 0 12 ? * WED 表示每个星期三中午12点 
"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触发 

有些子表达式能包含一些范围或列表

例如:子表达式(天(星期))可以为 “MON-FRI”,“MON,WED,FRI”,“MON-WED,SAT”

“*”字符代表所有可能的值

因此,“*”在子表达式()里表示每个月的含义,“*”在子表达式(天(星期))表示星期的每一天

 

“/”字符用来指定数值的增量

例如:在子表达式(分钟)里的“0/15”表示从第0分钟开始,每15分钟

         在子表达式(分钟)里的“3/20”表示从第3分钟开始,每20分钟(它和“3,23,43”)的含义一样


“?”字符仅被用于天(月)和天(星期)两个子表达式,表示不指定值

当2个子表达式其中之一被指定了值以后,为了避免冲突,需要将另一个子表达式的值设为“?”

 

“L” 字符仅被用于天(月)和天(星期)两个子表达式,它是单词“last”的缩写

但是它在两个子表达式里的含义是不同的。

在天(月)子表达式中,“L”表示一个月的最后一天

在天(星期)自表达式中,“L”表示一个星期的最后一天,也就是SAT

如果在“L”前有具体的内容,它就具有其他的含义了

例如:“6L”表示这个月的倒数第6天,“FRIL”表示这个月的最一个星期五

注意:在使用“L”参数时,不要指定列表或范围,因为这会导致问题

 

 

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


  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值