配置文件java
<?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:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd " default-autowire="byName"> <!-- 0 0 */2 * * ? 每兩小時、整點觸發 --> <!-- 0 0/2 * * * ? 每兩分鐘 --> <!-- 0/5 * * * * ? 每五秒鐘 --> <!-- 0 15 10 * * ? 天天Y分X點觸發 --> <!-- 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時觸發. --> <!--建立自定義任務類--> <bean id="startNotifyTask" class="com.alibaba.meeting.task.StartNotifyTask"> <property name="source" value="${meeting.work.source}"></property> <property name="action" value="${meeting.work.action.notify}"></property> <property name="executeMachineName" value="${meeting.execute_machine_name}"></property> </bean> <!--建立任務詳情對象--> <bean id="jobStartNotify" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <!--注入任務類--> <property name="targetObject" ref="startNotifyTask"/> <!--任務類中執行的任務方法--> <property name="targetMethod"> <value>run</value> </property> <property name="concurrent" value="false"/> </bean> <!--建立觸發器對象--> <bean id="cronStartNotify" class="org.springframework.scheduling.quartz.CronTriggerBean"> <!--注入任務詳情對象--> <property name="jobDetail" ref="jobStartNotify"/> <!--注入corn表達式--> <property name="cronExpression"> <value>0 0/1 * * * ?</value> </property> </bean> <!--建立自定義任務類--> <bean id="taskEndNotify" class="com.alibaba.meeting.task.EndNotifyTask"> <property name="source" value="${meeting.work.source}"></property> <property name="action" value="${meeting.work.action.notifyEnd}"></property> <property name="executeMachineName" value="${meeting.execute_machine_name}"></property> </bean> <!--建立任務詳情對象--> <bean id="jobEndNotify" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <!--注入任務類--> <property name="targetObject" ref="taskEndNotify"/> <!--任務類中執行的任務方法--> <property name="targetMethod"> <value>run</value> </property> <property name="concurrent" value="false"/> </bean> <!--建立觸發器對象--> <bean id="cronEndNotify" class="org.springframework.scheduling.quartz.CronTriggerBean"> <!--注入任務詳情對象--> <property name="jobDetail" ref="jobEndNotify"/> <!--注入corn表達式--> <property name="cronExpression"> <value>0 0/1 * * * ?</value> </property> </bean> <!--建立自定義任務類--> <bean id="taskCostSettle" class="com.alibaba.meeting.task.CostSettleTask"> <property name="source" value="${meeting.work.source}"></property> <property name="action" value="${meeting.work.action.costsettle}"></property> <property name="executeMachineName" value="${meeting.execute_machine_name}"></property> </bean> <!--建立任務詳情對象--> <bean id="jobCostSettle" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <!--注入任務類--> <property name="targetObject" ref="taskCostSettle"/> <!--任務類中執行的任務方法--> <property name="targetMethod"> <value>run</value> </property> <property name="concurrent" value="false"/> </bean> <!--建立觸發器對象--> <bean id="cronCostSettle" class="org.springframework.scheduling.quartz.CronTriggerBean"> <!--注入任務詳情對象--> <property name="jobDetail" ref="jobCostSettle"/> <!--注入corn表達式--> <property name="cronExpression"> <value>0 0/1 * * * ?</value> </property> </bean> <!--會議結束後生成訂單--> <bean id="createOrderTask" class="com.alibaba.meeting.task.CreateOrderTask"> <property name="executeMachineName" value="${meeting.execute_machine_name}"></property> </bean> <bean id="jobcreateOrderTask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="createOrderTask"/> <property name="targetMethod"> <value>run</value> </property> <property name="concurrent" value="false"/> </bean> <bean id="croncreateOrderTask" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail" ref="jobcreateOrderTask"/> <property name="cronExpression"> <value>0 31 * * * ?</value> </property> </bean> <bean id="croncreateOrderTask2" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail" ref="jobcreateOrderTask"/> <property name="cronExpression"> <value>0 1 */1 * * ?</value> </property> </bean> <!--建立任務調度對象--> <bean autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <!--注入觸發器--> <property name="triggers"> <list> <ref bean="cronStartNotify"/> <ref bean="cronEndNotify"/> <ref bean="cronCostSettle"/> <ref bean="croncreateOrderTask"/> <ref bean="croncreateOrderTask2"/> </list> </property> </bean> </beans>
會議結束後生成訂單com.baizhi.meeting.task.CreateOrderTask.java文件web
package com.baizhi.meeting.task; import com.baizhi.meeting.manager.BookInfoManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; /** * Created by jrs on 16-7-25. */ public class CreateOrderTask extends CheckTask { private Logger logger = LoggerFactory.getLogger(CreateOrderTask.class); @Autowired private BookInfoManager bookInfoManager; public void run() { if(checkExecuteMachine()) { logger.info("CreateOrderTask start"); bookInfoManager.createNotPayOrder(); logger.info("CreateOrderTask end"); } } }
checkTask.javaspring
package com.baizhi.meeting.task; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.net.InetAddress; import java.net.UnknownHostException; public class CheckTask { private final Logger log = LoggerFactory.getLogger(CheckTask.class); private String executeMachineName; public String getExecuteMachineName() { return executeMachineName; } public void setExecuteMachineName(String executeMachineName) { this.executeMachineName = executeMachineName; } /** * 判斷執行的機器 * * @return */ public boolean checkExecuteMachine() { String currentMachineName = getCurrentMachineName(); if (currentMachineName.equals(executeMachineName)) { return true; } log.info("不能在[" + currentMachineName + "] 這臺機器上執行任務,只能在[" + executeMachineName + "]上執行"); return false; } private String getCurrentMachineName() { InetAddress addr; String hostName = ""; try { addr = InetAddress.getLocalHost(); hostName = addr.getHostName(); } catch (UnknownHostException e) { return ""; } return hostName; } }
1. Java中專門作定時的工具類Timerapache
1.注意:在測Java工具類Timer時,不能用JUnit測試來測。app
緣由是:用JUnit發佈webService時,服務聽不下來(用main函數發佈)。JUint測試Timer定時,服務 聽 不下來(用main函數發佈)。框架
2.Timer這個類是java.util下的一個類,不是抽象類,也不是接口,因此能夠直接new類的對象,Timer timer= new Timer();這樣就建立了一個定時任務的對象。函數
3.對象中有一個schedule方法。要告訴對象,要調度那些任務,這些任務什時候開始執行,什麼時間 結束,時重複執行,執行幾回,是執行一次,仍是執行屢次。 工具
2. java中的工具類Timer,執行定時週期測試
1.方法schedule參數的意思:this
TimerTask(){}:定時執行的任務。
new Date():開始執行時間。
1000:週期執行的時間間隔。注意:時間單位爲毫秒。
3. 代碼解析
4. Timer工具類的缺點
缺點:不能很好的解決項目中,複雜的業務,好比,某一天的某一整點運行,或者這一年的幾個時間點 去運行。那麼就須要進行復雜時間的計算,但有是也無法達到效果。
5.Java項目直接轉爲web項目
6. Timer與web項目的集成
會把定時任務放到咱們的監聽器中執行。監聽器去實現servletContextListener接口,監聽器中有兩 個方法,一個是初始化ContextInitialized,一個是銷燬ContextDestoryed。因此定時任務要在初始化 方法中作。只要初始化了監聽器,就會執行定時任務。往後爲了類的複用。咱們本身寫一個MyTask類 去繼承TimerTask。
1.自定義定時任務
2.自定義監聽器
3.監聽器在web.xml中的配置
7. 注意
1. Quartz是一個開源的定時任務框架.
2. What is Quartz?
Job Scheduling(調度) Library(庫)
Quartz is a richly(豐富地) featured, open source job scheduling library that can be integrated(集成) within virtually any Java application - from the smallest stand-alone(桌面級) application(應用) to the largest e-commerce(電商) system. Quartz can be used to create simple or complex schedules for executing tens, hundreds, or even tens-of-thousands of jobs; jobs whose tasks are defined as standard Java components that may execute virtually anything you may program them to do. The Quartz Scheduler includes many enterprise-class features, such as support for JTA transactions and clustering.
Quartz is freely usable, licensed under the Apache 2.0 license.
3. Quartz在非web中的應用
版本一:
1.自定義任務類必須實現quartz規定的Job接口
2.不多用測試
版本二:
1.自定義任務類必須實現quartz規定的Job接口
2.經常使用測試
3.Cron表達式的生成
4.Quartz與Spring的整合
1.環境的搭建,相關jar包
2.自定義任務
3.Spring配置文件的配置
4.測試代碼
5.注意:
1.自定義任務中,不能執行多個方法。
2.必須爲每一個任務詳情對像在建立一次對象。