Quartz和Timer两种定时器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_28643437/article/details/81234575

1:Quartz:需要引入jar包quartz-2.2.3.jar、quartz-jobs-2.2.3.jar


一、首先在spring中配置


    <!-- 定义调用的对象及对象中的方法 -->
    <bean id="jobDetail1" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject"> <bean class="com.operator.task.testTask"/> </property> <!-- 定时对象 --> 
        <property name="targetMethod" value="test"/> <!-- 定时对象中的执行方法 -->
        <property name="concurrent" value="false"/> <!-- 是否支持并发 -->
    </bean>
    
    
    
    <!-- 触发器:定义出发器执行的脚本的时间  -->
    <bean id="simple"
          class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
        <property name="jobDetail" ref="jobDetail1"/>
        <property name="startDelay" value="3000"/>  <!-- 项目启动多久毫秒后执行 -->
        <property name="repeatInterval" value="3000"/>  <!-- 每隔多少毫秒执行 -->
    </bean>
    
    
    
     <!-- 总管理类,启动触发器的配置, 如果将lazy-init='false'那么容器启动就会执行调度程序 --> 
        <bean name="xxxTask" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref bean="simple"/> <!-- 可以配置多个 -->
            </list>
        </property>
    </bean>
    
 
 二、要在web.xml监听一下
     <listener>
        <listener-class>com.operator.common.ShutdownQuartz</listener-class>
    </listener>
    
    
    
三、监听类 (每次重启tomcat的时候关掉上次的定时任务)
public class ShutdownQuartz implements ServletContextListener {

    private final static Logger log = Logger.getLogger(ShutdownQuartz.class);

    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
        try {
            ApplicationContext ac = SpringContext.getApplicationContext();
            Scheduler scheduler = (Scheduler) ac.getBean("xxxTask");
            scheduler.shutdown(true);
        } catch (Exception e) {
            log.error(e);
        }

    }

    @Override
    public void contextInitialized(ServletContextEvent arg0) {

    }  
    } 

2:Timer:


一、开启监听
  <listener>    
		<listener-class>com.operator.struts.action.xxxListener</listener-class>    
	</listener>
	
二、监听类
public class xxxListener implements ServletContextListener {
	private Timer timer = null;
	//每12个小时执行一次
	private static long  L_EXE_TIME = 12*60*60*1000L;
	@Override
	public void contextDestroyed(ServletContextEvent arg0) {
		if(timer!=null){ 		
			timer.cancel();
		}

	}

	@Override
	public void contextInitialized(ServletContextEvent arg0) {		
		startTask(L_EXE_TIME);
	}
	
	
	/** 
     * 循环执行任务
     * @param myTask 要执行的任务 
     * @param dayInterval 每隔多少天执行一次任务 
     * @author xxx
     * @since 20180529
     * */  
    public void startTask(long dayInterval){  
        if(timer==null){
          timer = new Timer(true);
        }
        timer.schedule(new xxxTools(), 0, dayInterval);
    } 

}

三、任务类

public class xxxTools extends TimerTask {

	@Override
	public void run() {
		// Date bD= new Date();
		doDhcpdata();
		 //Date eD= new Date();
		 //logger.info(" 本次数据处理: "+((eD.getTime()-bD.getTime())/1000)+"秒");
	}
	
	
	/**
	 * 定时执行任务
	 * @since 20180529
	 * @author xxx
	 */
	public static void doDhcpdata() {
		
	}

}

精确度和功能

  Quartz可以通过cron表达式精确到特定时间执行,而TimerTask不能。Quartz拥有TimerTask所有的功能,而     TimerTask则没有。Quartz每次执行任务都创建一个新的任务类对象,而TimerTask则每次使用同一个任务类对象。Quartz的某次执行任务过程中抛出异常,不影响下一次任务的执行,当下一次执行时间到来时,定时器会再次执行任务;而TimerTask则不同,一旦某个任务在执行过程中抛出异常,则整个定时器生命周期就结束,以后永远不会再执行定时器任务

 

猜你喜欢

转载自blog.csdn.net/qq_28643437/article/details/81234575