写了一个spring+quartz的定时任务,但是发现tomcat正常启动后并没有马上执行。网上也没找到能解决的办法,只能自己慢慢试。此文章是自己作为笔记用的,仅供参考。本人菜鸟,文中很多用词可能不当,勿喷。

spring+quartz定时任务网上有很多资料可以参考,我这里就不多说了,直接贴上我的代码。

1.项目结构

2.pom.xml添加包

<!-- 定时任务 -->
<dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.3.0</version>
</dependency>

3.spring-quartz.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 启动触发器的配置开始 --><!--lazy-init="false" 表示不需要延迟加载,容器启动就会执行--><bean id="quartzsScheduler" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"><property name="triggers"><list><ref bean="imageTrigger" /></list></property></bean><!-- 触发器 quartz的配置 --><bean id="imageTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"><property name="jobDetail" ref="testJobDetail" /><!-- 每天8点到22点,每半小时触发一次 --><property name="cronExpression" value="0 0/30 8-22 * * ?" /></bean><!-- job的配置开始 --><bean id="testJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"><!-- 调用的类  --><property name="targetObject" ref="orderImageService" /><!-- 调用类中的方法  --><property name="targetMethod" value="queryOrderImageFromOCR" /></bean>
</beans>

4.修改之前的spring-mvc.xml

<!-- 定时任务管理 -->
<import resource="classpath:/spring/spring-quartz.xml"/><!-- bean管理 -->
<import resource="classpath:/spring/spring-bean.xml"/>

5.web.xml

<servlet><servlet-name>microManager</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath*:spring/spring-mvc.xml</param-value></init-param>
</servlet>
<servlet-mapping><servlet-name>microManager</servlet-name><!-- 所有的的请求,都会被DispatcherServlet处理 --><url-pattern>*.do</url-pattern>
</servlet-mapping>
<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

定时任务具体执行的方法就不写了,根据自己的需求来。

按照上述的配置,在正常启动tomcat后,并没有马上执行配置的定时任务,必须要项目里有方法被调用后才会执行。

查了很久资料,发现web.xml中必须直接加载配置定时任务的xml文件,而我写的是web.xml直接加载spring-mvc.xml,然后在spring-mvc.xml中引入spring-quartz.xml。

于是,我在web.xml中添加了

<context-param><param-name>contextConfigLocation</param-name><param-value>classpath*:spring/spring-quartz.xml</param-value>
</context-param>

然后重启服务,这次定时任务马上执行了。

可是又出现了新的问题:项目中用的mybatis,定时任务执行的方法中也有对数据库的操作,而数据库的配置配置配置,注解的配置都是在spring-mvc.xml中的,在调用对数据库操作的方法(orderRecordMapper.selectByState(state))时报错,原因是orderRecordMapper为null。

这就意味着当我的web.xml中的内容为

<context-param><param-name>contextConfigLocation</param-name><param-value>classpath*:spring/spring-quartz.xml</param-value>
</context-param>
<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet><servlet-name>microManager</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath*:spring/spring-mvc.xml</param-value></init-param>
</servlet>
<servlet-mapping><servlet-name>microManager</servlet-name><!-- 所有的的请求,都会被DispatcherServlet处理 --><url-pattern>*.do</url-pattern>
</servlet-mapping>

时,spring-quartz.xml是加载了,但是spring-mvc.xml中的内容好像就失效了,至少是不能共用的,具体原因还不太清楚,对这块的知识太欠缺了,但是并不影响我解决问题。

于是我又修改了web.xml文件为

<context-param><param-name>contextConfigLocation</param-name><param-value>classpath*:spring/spring-quartz.xmlclasspath*:spring/spring-mvc.xml</param-value>
</context-param>
<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet><servlet-name>microManager</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping><servlet-name>microManager</servlet-name><!-- 所有的的请求,都会被DispatcherServlet处理 --><url-pattern>*.do</url-pattern>
</servlet-mapping>

OK了,tomcat重新启动后,定时任务马上执行,而且执行的方法也没有问题。

你以为就这样结束了么,那你就错了。

我既然改动了<servlet-mapping>中的内容,那么会不会对我的http接口有影响呢,果然,测试发现原来能正常调用的接口,现在调用报错,说找不到microManager-servlet.xml。WTF什么鬼,项目里根本没有这个xml,不过有microManager,那么肯定就是由于改动了<servlet-mapping>中的内容导致的。

好吧,我再次改动web.xml,所幸,这次改动后一切都正常,终于搞定了。中间的过程省略了很多,因为自己只是的羸弱,只能靠摸索,反正花了很长时间。

web.xml终极版:

<context-param><param-name>contextConfigLocation</param-name><param-value>classpath*:spring/spring-quartz.xmlclasspath*:spring/spring-mvc.xml</param-value>
</context-param>
<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet><servlet-name>microManager</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath*:spring/spring-mvc.xml</param-value></init-param>
</servlet>
<servlet-mapping><servlet-name>microManager</servlet-name><!-- 所有的的请求,都会被DispatcherServlet处理 --><url-pattern>*.do</url-pattern>
</servlet-mapping>

这个问题总算告一段落,可解决这个问题的过程中又出现很多新的问号:

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:大神就不用了哈)。

第一次分享,很多地方写的有问题,欢迎大家批评指教哈,有不清楚的地方也可以指出来的,我会一一解答,如果我也不清楚就没得办法了。哈哈。

spring+quartz定时任务启动服务后没有马上执行相关推荐

  1. Spring+Quartz定时任务调度

    Spring+Quartz定时任务调度   2011/5 zqhxuyuan@gmail.com 参考文章: http://www.iteye.com/topic/399980 ­ org.sprin ...

  2. quartz定时任务启动报错

    quartz定时任务启动报错 报错代码如下 org.springframework.beans.factory.BeanCreationException: Error creating bean w ...

  3. Spring+Quartz定时任务集群环境下部署的解决方法

    1.配置quartz.properties文件,如下 #======================================================================== ...

  4. Spring—Quartz定时调度CronTrigger时间配置格式说明与实例

    1 .CronTrigger时间格式配置说明 CronTrigger配置格式: 格式: [秒] [分] [小时] [日] [月] [周] [年] 序号 说明 是否必填 允许填写的值 允许的通配符 1 ...

  5. java做服务启动_实现服务启动之后,马上执行任务的几种方法

    有哪些方法 实现服务启动之后,马上执行相关操作? 方式一 :@PostConstruct 对类的要求 无,普通的java bean即可 例如: /*** * 执行完构造方法之后就会执行该方法 */ @ ...

  6. Spring整合定时任务调度框架Quartz实

    Spring整合定时任务调度框架Quartz实战 定时的任务处理在程序开发中应用的相当普遍,之前一直使用JDK的Timer类库来做任务调度功能不是很方便,因为它不能像cron服务那样可以指定具体年.月 ...

  7. spring+quartz实现定时调度

    spring+quartz实现任务调度在web应用启动时调度工厂就启动,web应用停止时,调度工厂也就停止工作,这种和web应用一致的声明周期很适合来实现任务调度,下面介绍使用方法. (一)需要的ja ...

  8. Spring+Quartz制作定时祝福短信

    Spring+Quartz制作定时祝福短信 文章目录 前言 一.我的准备过程 二.配置文件信息 1.applicationContext.xml内容 2.message.properties内容 3. ...

  9. 一文读懂 Spring Boot、微服务架构和大数据治理三者之间的故事

    微服务架构 微服务的诞生并非偶然,它是在互联网高速发展,技术日新月异的变化以及传统架构无法适应快速变化等多重因素的推动下诞生的产物.互联网时代的产品通常有两类特点:需求变化快和用户群体庞大,在这种情况 ...

最新文章

  1. 自己动手生成评论RSS
  2. 【0729作业】随机生成20个手机号码
  3. vue中数组长度_vue.js - 如何获得动态数组的数组长度 - SO中文参考 - www.soinside.com...
  4. 中国搜索引擎市场用户行为洞察2020
  5. 计算多项式的值(信息学奥赛一本通-T1093)
  6. 开课吧:MySQL索引的使用知识有哪些?
  7. 分享10个创新的扁平风格的简历页面设计
  8. node.js 实现udp传输_nodejs实现UDP组播示例方法
  9. php xml三级联动,jquery+xml实现三级联动步骤详解
  10. 【数据结构实验题】0/1背包问题的递归求解(注意输出所选物品下标的方法)
  11. 软件测试 因果+决策案例--中国象棋中走马
  12. Python爬取周杰伦的200首歌+BI可视化分析
  13. 《大型分布式网站架构设计与实践》
  14. Gentoo搭建PPTP服务器
  15. mac 上安装selenium, phantomjs 和 chromedriver
  16. 腾讯程序员与医生相恋,却被女方父母拆散,你们不能在一起
  17. 实现网站流量统计(监控网站流量)
  18. CAJ转WORD的方法(原创方法,仅用于学习记录,免费但是很麻烦)
  19. c语言编程统计学生个数,c编程统计并显示500至800之间所有素数的总个数以及总和...
  20. 恨一个人要比爱一个人付出更多的情感……

热门文章

  1. 海外智能硬件明星项目
  2. 计算机模拟专业委员会,计算机专业委员会
  3. 东华大学python题库_简单的中国MOOC大学列表提取 - Python
  4. p8h61主板升级cpu_如何升级和安装新的CPU或主板(或两者)
  5. 街机格斗游戏拳皇97 for Mac
  6. 通过与物联网企业合作,打造区块链+物联网赋能平台
  7. python游戏设计_Python设计一个猜大小游戏
  8. 1454:山峰和山谷
  9. 路由器上静态路由设置,实现不在通一网段的网络通信方法
  10. 【毕业生】简历究竟应该怎么“写”?