java中的定時器:
定時器:job對應於多個trigger 但是trigger 只能對應一個job。。之後schedule對應於trigger調度定時器。
閒暇時刻,看到spring的官方文檔寫了一個定時器,感覺蠻好玩的,所以記錄一下。
第一步:導包
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.3.7.release</version>
</dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.3.7.release</version>
</dependency>
這三個包是必須要導入的,缺一個都不行。
導入之後需要配置xml文件:我的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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 配置job工作和實現方法的源頭-- 其中id是隨便起的,class是你在工程中的類名,value是該類中的方法名>
<bean id="quartz" class="com.psy.quartz!.Quartz"/>
<bean id="testTaskJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="quartz"/>
<property name="targetMethod" value="show"/>
<property name="concurrent" value="false"/>
</bean>
<!--
<bean id="testTaskTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="testTaskJob"/>
<property name="cronExpression" value="0/5 * * * * ?"/>
</bean>-->
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
<!-- see the example of method invoking job above -->
<property name="jobDetail" ref="testTaskJob"/>
<!-- 10 seconds -->
<property name="startDelay" value="10000"/>
<!-- repeat every 50 seconds -->
<property name="repeatInterval" value="3000"/>
</bean>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="simpleTrigger"/>
</list>
</property>
</bean>
</beans>
<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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 配置job工作和實現方法的源頭-- 其中id是隨便起的,class是你在工程中的類名,value是該類中的方法名>
<bean id="quartz" class="com.psy.quartz!.Quartz"/>
<bean id="testTaskJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="quartz"/>
<property name="targetMethod" value="show"/>
<property name="concurrent" value="false"/>
</bean>
<!--
<bean id="testTaskTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="testTaskJob"/>
<property name="cronExpression" value="0/5 * * * * ?"/>
</bean>-->
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
<!-- see the example of method invoking job above -->
<property name="jobDetail" ref="testTaskJob"/>
<!-- 10 seconds -->
<property name="startDelay" value="10000"/>
<!-- repeat every 50 seconds -->
<property name="repeatInterval" value="3000"/>
</bean>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="simpleTrigger"/>
</list>
</property>
</bean>
</beans>
基本步驟:先定義一個job----在根據job定義一個tigger----在定義一個schedule進行調度。其中的ref爲上一級的id,上文中已經用相同顏色的字體表表明(定時器:job對應於多個trigger
但是trigger 只能對應一個job。。之後schedule對應於trigger調度定時器。)
下圖爲我創建的定時任務,與上文中的:<bean id="quartz" class="com.psy.quartz!.Quartz"/>
測試的結果如下圖控制檯輸出的信息:
那麼怎麼啓動呢?很明顯這是有spring管理的,所以當你啓動web項目的時候就應該啓動,我把這個xml文件導入到sping-config.xml中了
所以當容器一啓動加載web.xml的時候便可以納入spring的管理項目,當然不止這一招,你還可以使用webapplication啓動。或者說是加載xml文件,具體的仁者見仁了。
需要說明的是,可以定義多個定時器,配置的方法和單個的定時器是沒什麼差別的,但是要記住上文紅色文字所說明的。多個定時器要配置多個job,可以只配置一個tigger,但是一個tigge只可以對應一個job。下圖爲schedule配置多個trigger。
spring的參考文檔:http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/scheduling.html#scheduling-quartz