Spring定時任務不執行的解決
阿新 • • 發佈:2019-01-05
本以為spring定時任務挺簡單的,後來發現單純的進行檔案的配置有的時候定時任務並沒有執行,這是什麼原因呢?
通過看spring指導文件上的講解,以及通過對文件的理解做了一個Demo看一下,再說明這個問題。
1、demo的目錄結構
說明:圖中顯示的jar包都是需要的,親測缺少後會報錯
2、需要執行的任務類(這裡是沒有使用註解的,如果理解了下面的配置我覺得註解會更容易)
package com.schedule.task; import java.text.SimpleDateFormat; import java.util.Date; /** * * 需要執行的任務 * * */ public class MyJob{ /** * @param 空 * @return void * 執行方法列印系統當前時間 * */ public void doIt(){ SimpleDateFormat myFmt=new SimpleDateFormat("yyyy年MM月dd日 HH時mm分ss秒"); Date now=new Date(); System.out.println(myFmt.format(now)); } }
3、web.xml中的配置
4、spring配置檔案 applicationContext.xml<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <display-name></display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <servlet-name>timer</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:timer-servlet.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>timer</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> </web-app>
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:p="http://www.springframework.org/schema/p" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd" default-lazy-init="false"> <bean id="myJob" class="com.schedule.task.MyJob"></bean> <bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="myJob"/> <property name="targetMethod" value="doIt"/> <property name="concurrent" value="false"/> </bean> <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail" ref="jobDetail"/> <property name="cronExpression" value="*/2 * * * * ?"/> </bean> <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="cronTrigger"/> </list> </property> </bean> </beans>
timer-servlet.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"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-4.1.xsd"
default-lazy-init="false">
</beans>
5、現在將demo部署到tomcat,並啟動tomcat,檢視結果
6、在做的過程中遇到的問題:啟動之後,定時任務不執行
(1)猜測是有關的類沒有找到,當ctrl+滑鼠左鍵點選下面這段程式碼的
org.springframework.scheduling.quartz.CronTriggerBean時,並沒有定位到原始碼,後來發現spring-4.1.6中已經沒有這個類了,spring指導文件已經將其換成
org.springframework.scheduling.quartz.CronTriggerFactoryBean
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="jobDetail"/>
<property name="cronExpression" value="*/2 * * * * ?"/>
</bean>
(2)原來定時任務的配置是在 timer-servlet.xml檔案中的,發現還是沒有執行,後來將定時任務配置改到applicationContext.xml 中定時任務執行了,感覺這個定時任務需要有一個類似於監聽器的類,即web.xml中配置的
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
看來還是應該注重細節。
寫的不好,主要讓自己認識到自己的錯誤,以此為鑑,也希望給大家提供一些參考。