JDK自带的Timer定时器实现每天24点修改数据

Java项目中常使用的定时器有JDK Timer、Quartz、Spring Task等三种。Quartz的功能强大,配置也比较复杂,适合大型、多定时任务的项目使用。Spring Task配置较为简单轻量,需要Spring框架支持。JDK自带的定时器Timer使用灵活,配置简单,适合中小型项目。

Timer和TimerTask

Timer是jdk中提供的一个定时器工具,使用的时候会在主线程之外起一个单独的线程执行指定的计划任务,可以指定执行一次或者反复执行多次。

TimerTask是一个实现了Runnable接口的抽象类,代表一个可以被Timer执行的任务。

定时需要有一个触发的方法,项目使用监听器实现定时任务触发

一、web.xml配置


    com.cgb.tspsystem.listener.TimerTaskListener
 

二、TimerTaskListener

package com.cgb.tspsystem.listener;

import java.util.Calendar;
import java.util.Date;
import java.util.Timer;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import com.cgb.tspsystem.utils.TaskMethod;

public class TimerTaskListener  implements ServletContextListener{
	/*public static void main(String[] args) {
		Calendar calendar = Calendar.getInstance();  
        calendar.set(Calendar.HOUR_OF_DAY, 24); // 24点 可以更改时间  
        calendar.set(Calendar.MINUTE, 0); // 0分 可以更改分数  
        calendar.set(Calendar.SECOND, 0);// 0 默认为0,不以秒计  
        Date date = calendar.getTime();
        long time=24*60*60*1000;//24个小时
        Timer timer= new Timer();
    	TaskMethod taskMethod=new TaskMethod();;
		timer.schedule(taskMethod, date, time);// 在凌晨24点零分零秒后执行此任务,每次间隔24小时
	}*/
	Timer timer= new Timer();
	TaskMethod taskMethod=new TaskMethod();;
	public void contextInitialized(ServletContextEvent sce) {
		Calendar calendar = Calendar.getInstance();  
        calendar.set(Calendar.HOUR_OF_DAY, 24); // 24点  可以更改时间  
        calendar.set(Calendar.MINUTE, 0); // 0秒 可以更改分数  
        calendar.set(Calendar.SECOND, 0);// 0  默认为0,不以秒计  
        Date date = calendar.getTime();
        long time=24*60*60*1000;//24个小时
		timer.schedule(taskMethod, date, time);//在凌晨24点零分零秒后执行此任务,每次间隔24小时
		// 第一种方法:指定任务task在指定时间time执行
        //schedule(TimerTask task, Date time)
        // 第二种方法:指定任务task在指定延迟delay后执行
        //schedule(TimerTask task, long delay)  
        // 第三种方法:指定任务task在指定时间firstTime执行后,进行重复固定延迟频率peroid的执行   
        // schedule(TimerTask task, Date firstTime,long period) 
        // 第四种方法:指定任务task 在指定延迟delay 后,进行重复固定延迟频率peroid的执行    
        // schedule(TimerTask task, long delay, long period)   
        // 第五种方法:指定任务task在指定时间firstTime执行后,进行重复固定延迟频率peroid的执行    
        // scheduleAtFixedRate(TimerTask task,Date firstTime,long period) 
        // 第六种方法:指定任务task 在指定延迟delay 后,进行重复固定延迟频率peroid的执行   
        // scheduleAtFixedRate(TimerTask task, long delay, long period)
	}
 
	 @Override
	    public void contextDestroyed(ServletContextEvent sce) {
		 timer.cancel();
	}
}

三、TaskMethod

package com.cgb.tspsystem.utils;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimerTask;

import javax.servlet.ServletContext;

public class TaskMethod extends TimerTask{
	
    public void run() {
    	EndMethod em=new EndMethod();
    	/*Date dt = new Date();  
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");  
        System.out.println("定时执行:"+sdf.format(dt));*/
        em.run();        
    }
}

四、EndMethod

我们在应用场景中会遇到每一个任务的执行时间都不相同,并且每一个任务只执行一次,如果按照上面的做法,就是每次生成一个TimerTask放到Timer中执行,这样太耗费资源了,我们需要实现一个线程来监听所有的任务。

package com.cgb.tspsystem.utils;

import com.cgb.core.persistent.Constants;
import com.cgb.core.persistent.DataManager;
import com.cgb.core.persistent.db.DBDataModel;

public class EndMethod implements Runnable{
	
	@Override
	public void run() {
		System.out.println("运政系统从业人员满六十周岁自动注销资格证-->开始");  
        update();
	}
	
	DBDataModel dm = new DBDataModel();
	public void update() {
			dm.clear();
			String sql = "UPDATE (SELECT * FROM TB_EMP_CERTIFIC t LEFT JOIN TB_EMP_PERSON p ON t.V_VCH_PERSON_ID=p.V_VCH_PERSON_ID WHERE p.V_VCH_NAME ='王文义' AND p.V_DTM_BIRTHDAY < add_months(sysdate,-720)) A SET A.V_CHR_CERTIFIC_STATE='S'";
			dm.setMode(Constants.MODE_UPDATE);
			dm.setSQL(sql);
			DataManager.getHandler(dm).executeUpdate(dm);
			System.out.println(dm.getMode());
			System.out.println("注销完成!");
		
	}
}

 

你可能感兴趣的:(JAVA基础)