Java Quartz實現定時功能
阿新 • • 發佈:2019-01-25
功能描述:在開發程式中很多時候會出現希望在某個時間點、一段時間後執行某個動作,此時即需要實現定時功能,也就是希望程式能夠自己進行監督,從而達到在希望的時間觸發相應的事件。
一、在maven中加入Quartz的依賴
<dependencies> <!--定時排程--> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.2.2</version> </dependency> </dependencies>
二、在web.xml檔案中整合quartz的配置檔案
<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/j2ee/web-app_3_0.xsd"> <display-name>TestTime Web Application</display-name> <context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/spring-quartz.xml </param-value> </context-param> <!-- Servlet Filters ================================================ --> <!-- 編碼過濾器 --> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- - Declare Spring context listener which sets up the Spring Application Context - containing all Cocoon components (and user defined beans as well). --> <!-- Spring監聽器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 防止Spring記憶體溢位監聽器 <listener> <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class> </listener>--> <!-- - Declare Spring request listener which sets up the required RequestAttributes - to support Springs and Cocoon custom bean scopes like the request scope or the - session scope. --> <listener> <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> </listener> <!-- Servlet Configuration ========================================== --> <servlet> <display-name>TestTimeDispatcherServlet</display-name> <servlet-name>testTime-job-dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <!-- URL space mappings ============================================= --> <servlet-mapping> <servlet-name>testTime-job-dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!-- 預設首頁 --> <welcome-file-list> <welcome-file>/index.jsp</welcome-file> </welcome-file-list> </web-app>
三、配置spring-quartz.xml檔案
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <description>Quartz Job Setting</description> <!-- 新建每個需要的配置--> <import resource="quartz/testPrint.xml"></import> <import resource="quartz/print.xml"></import> <!-- D.Quartz的排程工廠,排程工廠只能有一個,多個排程任務在list中新增 --> <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <!-- 所有的排程列表--> <ref bean="testTrigger"/> <ref bean="printTrigger"/> </list> </property> </bean> </beans>
四、配置print.xml檔案
其中MyPrintJob表示的是定時任務的類;屬性targetObject表示指向那個任務類;屬性targetMethod表任務類的任務方法。屬性concurrent表示:對於相同的JobDetail,當指定多個Trigger時, 很可能第一個job完成之前,第二個job就開始了。當concurrent設為false,多個job不會併發執行,第二個job將不會在第一個job完成之前開始。
<?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">
<!-- A.配置排程的任務對應bean的id和自定義class-->
<bean id="print" class="com.testTime.job.schedule.test.MyPrintJob"/>
<!-- B.配置排程任務對應的bean的id和執行的方法,作業不併發排程-->
<bean id="printDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="print"/>
<property name="targetMethod" value="print"/>
<property name="concurrent" value="false"/>
</bean>
<!-- C.配置排程任務執行的觸發的時間-->
<bean id="printTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="printDetail"/>
<property name="cronExpression">
<!-- 秒 分 時 月的某天 月 星期的某天 年 除了年都是必須值 -->
<!-- 每3秒執行任務排程 -->
<value>0/3 * * * * ?</value>
</property>
</bean>
</beans>
下圖是cronExpression的具體意義。/**
* ----------------------------
* 【位置說明】:
* 1 - 秒(0–59)
* 2 - 分(0–59)
* 3 - 時(0–23)
* 4 - 日(1–31)
* 5 - 月(1–12)
* 6 - 星期(SUN–SAT or 1–7)
* 7 - 年(可選, 1970–2099)
* --------------------------------
* 【符號說明】
* 0 0 12 * * ?---------------在每天中午12:00觸發
* 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:00至2:59之間每分鐘觸發一次
* 0 0/5 14 * * ?---------------每天在下午2:00至2:59之間每5分鐘觸發一次
* 0 0/5 14,18 * * ?---------------每天在下午2:00至2:59和6:00至6:59之間的每5分鐘觸發一次
* 0 0-5 14 * * ?---------------每天在下午2:00至2:05之間每分鐘觸發一次
* 0 10,44 14 ? 3 WED---------------每三月份的星期三在下午2:00和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, 2003, 2004 and 2005年的每個月的最後一個星期五的上午10:15觸發
* 0 15 10 ? * 6#3---------------在每個月的第三個星期五的上午10:15觸發
* 0 0 12 1/5 * ?---------------從每月的第一天起每過5天的中午12:00時觸發
* 0 11 11 11 11 ?---------------在每個11月11日的上午11:11時觸發
* @return
*/
四、具體任務類和任務方法的實現
package com.testTime.job.schedule.test;
import com.testTime.job.utils.DateFormatUtils;
import com.testTime.job.utils.LogUtils;
import com.testTime.job.utils.date.DateUtils;
public class MyPrintJob {
public void print(){
Integer current = DateUtils.getCurrentTimestamp();
LogUtils.trace(DateFormatUtils.format(current,"yyyy-MM-dd"));
}
}