在SPring定时器 中想在每月最后一天23:50进行一个定时器,但是网上找到 的语法貌似有问题:
@Scheduled(cron = "0 50 23 L * ?")
public void clearDocumentMonthReader() {
documentDao.clearweekAndMonthReader();
logger.info("清空周阅读量和月阅读量");
}
运行我的web程序报如下错误:
Caused by: java.lang.IllegalStateException: Encountered invalid @Scheduled method 'clearDocumentMonthReader': For input string: "L"
at org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor$1.doWith(ScheduledAnnotationBeanPostProcessor.java:219)
at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:473)
at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:451)
at org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor.postProcessAfterInitialization(ScheduledAnnotationBeanPostProcessor.java:109)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:412)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1494)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:524)
... 34 more
请问这个语法真的不支持 吗?我是用的是Spring 3
估计是Spring版本的问题了,没用过Spring的Scheduled不敢确定。给几个解决办法:
1、改用Spring quartz做定时任务,也要注意找Spring对应的quartz版本,quartz是支持你那种写法的。
2、改调度时间,改为每个月1号0点执行,效果差不多吧?
3、升级Spring,因为没用过Spring Scheduled也不能提供具体哪个版本可以。
楼主尝试下吧。
回复 @码上中国博客:用quartz直接用你写的那个cron就行了还麻烦给提供一个cron命令spring的cron表达式并非与Quartz完全一样,API中没说明DayOfMonth域支持LWC
http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/scheduling/support/CronSequenceGenerator.html
回复 @码上中国博客:表达式写成"00028-31**",然后在方法内再代码判断是否最后一天cron如何实现我想要的功能打开spring-context3.2.5包中的org.springframework.scheduling.support.CronSequenceGenerator类的源码可以看到类注释上有这么一句话:Datesequencegeneratorfora<a>Crontab"rel="nofollow">http://www.manpagez.com/man/5/crontab/">Crontabpattern</a>,我们打开网址,查看里面的说明文档发现,并没有说明它支持 L 这个表达式。
楼主如果非要这么写,可以试试用quartz
不那么写也行啊,麻烦给提供一个能够实现我想要的每月最后一天的格式呗。关于Spring定时任务每月最后一天corn表达式使用L报错可以使用如下解决办法:首先,每月最后一天可能为(28,29,30,31)这几天只需要在这几天调度程序,在程序中判断是否为最后一天,如果是则执行需要执行的代码块
@Scheduled(cron="0592328-31*?")publicvoidexecute(){finalCalendarc=Calendar.getInstance();if(c.get(Calendar.DATE)==c.getActualMaximum(Calendar.DATE)){//是最后一天System.out.println("重置密码错误次数!");}}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。