java定时任务以及Spring使用Quartz调度器执行定时任务

java下的java.util.Timer中类可以实现定时执行任务的执行:

如:让任务立即执行,每隔1s循环执行一次

	public class TimerClass {
	
		public static void main(String[] args) {
	
			Timer timer = new Timer();
	
			TimerTask task = new TimerTask() {
				int i = 0;
	
				@Override
				public void run() {
					i += 1;
					System.out.println("第" + i + "次执行");
				}
			};
			// 第二个参数,表示多长时间开始执行调度任务,
			// 第三个参数间隔多长时间执行
			timer.schedule(task, 0, 1000);
	
		}
	
	}
  • Timer缺陷:
    • Timer对调度的支持是基于绝对时间的,而不是相对时间,所以它对系统时间的改变非常敏感。
    • Timer线程是不会捕获异常的,如果TimerTask抛出的了未检查异常则会导致Timer线程终止,同时Timer也不会重新恢复线程的执行,他会错误的认为整个Timer线程都会取消。

缺陷:http://blog.csdn.net/chenssy/article/details/32703499

使用Executors管理线程,调用newScheduledThreadPool()方法来执行重复任务

http://www.jianshu.com/p/a898655b787a

定时任务在Spring中的应用

一、Spring3.0以后提供了基于Spring的轻量级时间调度框架,可定时执行一些任务

二、Spring中使用Quartz框架来做调度任务:主要讲述Quartz在Spring中的用法。

  • 从任务调度的触发时机来分,这里主要是针对作业使用的触发器,主要有以下两种:

    • 每隔指定时间则触发一次,在Quartz中对应的触发器为:org.springframework.scheduling.quartz.SimpleTriggerBean
    • 每到指定时间则触发一次,在Quartz中对应的调度器为:org.springframework.scheduling.quartz.CronTriggerBean
  • 从作业类的继承方式来讲,可以分为两类:

    • 作业类需要继承自特定的作业类基类,如Quartz中需要继承自org.springframework.scheduling.quartz.QuartzJobBean;java.util.Timer中需要继承自java.util.TimerTask。
    • 作业类即普通的java类,不需要继承自任何基类。

主要说明作业类不继承特定基类的方式。

Spring能够支持这种方式,归功于两个类:
org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean
org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean
这两个类分别对应spring支持的两种实现任务调度的方式,即前文提到到java自带的timer task方式和Quartz方式。这里我只写MethodInvokingJobDetailFactoryBean的用法,使用该类的好处是,我们的任务类不再需要继承自任何类,而是普通的pojo。

  • maven依赖

      <dependency>
      	<groupId>org.quartz-scheduler</groupId>
      	<artifactId>quartz</artifactId>
      	<version>2.2.2</version>
      </dependency>
    
  • 创建Job类

      public class ShowTimeJob {
      
      	private void showTime() {
      
      		System.out.println("每秒执行:" + new Date());
      
      	}
      
      }
    
  • 在ApplicationContext.xml中配置作业类

      <!-- 配置作业类 -->
      <bean id="job1"
      	class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
      	<property name="targetObject">
      		<bean class="com.yl.page.job.ShowTimeJob" />
      	</property>
      	<property name="targetMethod" value="showTime" />
      	<property name="concurrent" value="true" /><!-- 作业并发调度 -->
      </bean>
    
  • 配置触发器:Quartz提供两种触发器形式,cron和simple两种。

      <!-- 配置触发器两种配置一种即可,配置两种不行 -->
      <!-- CronTriggerBean,支持到指定时间运行一次,如每天12:00运行一次等。 -->
      <bean id="cronTrigger"
      	class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
      	<property name="jobDetail" ref="job1" />
      	<!-- 0 36 20 * * ? -->
      	<!-- Cron生成器网址:http://cron.qqe2.com/ -->
      	<property name="cronExpression" value="10/5 * * * * ?" />
      </bean>
    
      
      <!-- SimpleTriggerBean,只支持按照一定频度调用任务,如每隔30分钟运行一次。 -->
      <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
      	<property name="jobDetail" ref="job1" />
      	<property name="startDelay" value="0" /><!-- 调度工厂实例化后,经过0秒开始执行调度 -->
      	<property name="repeatInterval" value="2000" /><!-- 每2秒调度一次 -->
      </bean>
    
  • 配置工厂类,管理

      <!-- 配置工厂类 -->
      <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
      	<property name="triggers">
      		<list>
      			<ref bean="cronTrigger" />
      			<ref bean="simpleTrigger" />
      		</list>
      	</property>
      </bean>
    

使用cron的时候,可以使用cron表达式来对配置执行的时间,次数等,cron表达式生成器网址:http://cron.qqe2.com

其他更多可以参考:http://gong1208.iteye.com/blog/1773177

Demo:https://github.com/esileme/MybatisPager.git

posted @ 2017-09-22 22:49  esileme  阅读(371)  评论(0编辑  收藏  举报