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