写了一个spring+quartz的定时任务,但是发现tomcat正常启动后并没有马上执行。网上也没找到能解决的办法,只能自己慢慢试。此文章是自己作为笔记用的,仅供参考。本人菜鸟,文中很多用词可能不当,勿喷。
spring+quartz定时任务网上有很多资料可以参考,我这里就不多说了,直接贴上我的代码。
1.项目结构
2.pom.xml添加包
org.quartz-scheduler
quartz
2.3.0
3.spring-quartz.xml
4.修改之前的spring-mvc.xml
5.web.xml
microManager
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath*:spring/spring-mvc.xml
microManager
*.do
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
listener>
定时任务具体执行的方法就不写了,根据自己的需求来。
按照上述的配置,在正常启动tomcat后,并没有马上执行配置的定时任务,必须要项目里有方法被调用后才会执行。
查了很久资料,发现web.xml中必须直接加载配置定时任务的xml文件,而我写的是web.xml直接加载spring-mvc.xml,然后在spring-mvc.xml中引入spring-quartz.xml。
于是,我在web.xml中添加了
contextConfigLocation
classpath*:spring/spring-quartz.xml
然后重启服务,这次定时任务马上执行了。
可是又出现了新的问题:项目中用的mybatis,定时任务执行的方法中也有对数据库的操作,而数据库的配置配置配置,注解的配置都是在spring-mvc.xml中的,在调用对数据库操作的方法(orderRecordMapper.selectByState(state))时报错,原因是orderRecordMapper为null。
这就意味着当我的web.xml中的内容为
contextConfigLocation
classpath*:spring/spring-quartz.xml
org.springframework.web.context.ContextLoaderListener
microManager
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath*:spring/spring-mvc.xml
microManager
*.do
时,spring-quartz.xml是加载了,但是spring-mvc.xml中的内容好像就失效了,至少是不能共用的,具体原因还不太清楚,对这块的知识太欠缺了,但是并不影响我解决问题。
于是我又修改了web.xml文件为
contextConfigLocation
classpath*:spring/spring-quartz.xml
classpath*:spring/spring-mvc.xml
org.springframework.web.context.ContextLoaderListener
microManager
org.springframework.web.servlet.DispatcherServlet
microManager
*.do
OK了,tomcat重新启动后,定时任务马上执行,而且执行的方法也没有问题。
你以为就这样结束了么,那你就错了。
我既然改动了
好吧,我再次改动web.xml,所幸,这次改动后一切都正常,终于搞定了。中间的过程省略了很多,因为自己只是的羸弱,只能靠摸索,反正花了很长时间。
web.xml终极版:
contextConfigLocation
classpath*:spring/spring-quartz.xml
classpath*:spring/spring-mvc.xml
org.springframework.web.context.ContextLoaderListener
microManager
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath*:spring/spring-mvc.xml
microManager
*.do
这个问题总算告一段落,可解决这个问题的过程中又出现很多新的问号:
1.web.xml中param-name为contextConfigLocation的地方有两处,为何没有影响?如果把contextConfigLocation换成其他自定义的名字会不会有影响?
2.web.xml中context-param表示什么意思?
3.web.xml中不直接加载定时任务的spring-quartz.xml的情况下启动服务为何不马上执行?
4.web.xml中配置了spring-quartz.xml,为何对于mapper的注解失效?
这些问题还需要后续去弄明白,大家也可以和我一起探究(ps:大神就不用了哈)。
第一次分享,很多地方写的有问题,欢迎大家批评指教哈,有不清楚的地方也可以指出来的,我会一一解答,如果我也不清楚就没得办法了。哈哈。