package timer; import java.util.TimerTask; /** * 这是一个打铃的程序,必须隔一段时间打一次 * @author sam * */ public class RingTask extends TimerTask{ public RingTask() { // TODO Auto-generated constructor stub } public RingTask(int s,int d) { // TODO Auto-generated constructor stub this.second = s; this.delay = d; } int second = 1; int delay = 1; public void setSecond(int second) { this.second = second; } public void setDelay(int delay) { this.delay = delay; } @Override public void run() { // TODO Auto-generated method stub System.out.println("我是打铃程序!"+"我第一次打铃延迟了"+delay+"秒!"); System.out.println("打铃了!每过"+second+"秒一次"); } } 定义好后,下面需要注册调用了,注册调用的方法如下: public static void main(String[] args) { //以 java定时器的模式调用 Timer timer = new Timer(); timer.schedule( new RingTask(3,3), //需要注册的定时类 3000, //最开始先延迟3秒的时间 3000); //每隔3秒的时间调用一次 }
<!-- 定时器的配置 (spring定时器)--> <!-- 要调度的bean配置 --> <bean id="ringTask" class="timer.RingTask"> <!-- 给 属性 second 赋值 为 3 --> <property name="second" > <value>3</value> </property> <!-- 给 属性 delay 赋值 为 3 --> <property name="delay" > <value>3</value> </property> </bean> <!--配置一个触发器 配置触发器的参数--> <bean id="scheduleRingTask" class="org.springframework.scheduling.timer.ScheduledTimerTask"> <property name="delay" value="3000"></property> <!--第一次延迟3秒的时间--> <property name="period" value="3000"></property> <!--每隔3秒的时间执行一次--> <property name="timerTask" ref="ringTask"></property> <!--制定触发的类--> </bean> <!-- 总调度,用于启动定时器 --> <bean id="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean"> <property name="scheduledTimerTasks"> <list> <ref bean="scheduleRingTask"/> </list> </property> </bean>
Quartz 下载地址 :
http://grepcode.com/snapshot/repo1.maven.org/maven2/org.quartz-scheduler/quartz/1.7.3
首先下载包 :quartz-1.7.3.jar
把包放到 lib 里面。
API http://www.quartz-scheduler.org/api/2.2.1/package timer; /** * 开始上班,这个程序要求每天(非周末)早晨八点需要启动一次 * @author sam * */ public class StartWorkJob { public void startWork(){ System.out.println("我是上班程序,每天(非周末)早晨八点需要启动一次"); System.out.println("上班了!~"); } }看到了吗,这个类 StartWorkJob 并没有继承任何类也没有实现任何接口,且方法 start Work也是自己定义的,原有的业务代码不需要做任何更改。下面就要提到Quartz实现的一种机制,通过Spring提供的代理类( MethodInvokingJobDetailFactoryBean )来实现定时任务,这个类只需要提供它要代理的类以及要代理的方法,就能够很好的就行定时监控了。
<!-- Timer schedule --> <!--要调度的对象--> <bean id="jobBean" class="包.StartWorkJob" /> <bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="jobBean" /> <property name="targetMethod" value="execute" /> <!--将并发设置为false--> <property name="concurrent" value="false" /> </bean> <bean id="trigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail" ref="jobDetail" /> <!--表达式,我的是每 30 执行一次--> <property name="cronExpression" value="0/30 * * * * ?" /> </bean> <!-- 总管理类如果将lazy-init='false'那么容器启动就会执行调度程序 --> <bean id="startQuertz" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="false" > <property name="triggers"> <list> <!--作业调度器,list下可加入其他的调度器--> <ref bean="trigger" /> </list> </property> </bean>
<!-- 设置Spring的监听,项目启动时候初始化 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 指定Spring配置文件的路径 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/classes/applicationContext.xml</param-value> </context-param>