zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    css mix-blend-mode 混合模式
    vue-slicksort拖拽组件
    123457123457#0#-----com.yuming.TruckCarRun01--前拼后广--大卡车游戏cym
    123457123457#0#---------com.ppGame.SeaPuzzleGame73--前拼后广--宝宝海洋拼图pp
    123457123456#0#-----com.yuming.FromPuzzleGame01--前拼后广--宝宝农场拼图cym
    iOS中NSTimer的使用
    ios排序NSArray(数字.字符串)
    Github排名靠前的iOS库
    mac命令强制清空废纸篓
    我的iOS动画01
  • 原文地址:https://www.cnblogs.com/esileme/p/7577529.html
Copyright © 2011-2022 走看看