`
guzizai2007
  • 浏览: 359606 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

定时任务Timer使用

 
阅读更多

1、任务基类:

package com.sxit.common;

import java.util.Date;
import java.util.TimerTask;

/**
 * @功能:任务基类
 * @作者: smile
 * @时间:2013-3-28 下午2:32:29
 * @版本:1.0
 */
public class BaseTimerTask extends TimerTask{

	//任务类型
	public int type;
	
	//执行周期时间  毫秒
	public long period;
	
	//指定延迟执行时间 
	public long delay;
	
	//指定运行时间
	public Date runTime;
	
	/**
	 * 指定的时间运行,仅运行一次
	 * 对应Timer中的 schedule(TimerTask task, Date time)
	 */
	public static final int Schedule_Date=1;
	
	/**
	 * 指定时间开始周期运行(基于延迟)
	 * 用固定延迟调度。使用本方法时,在任务执行中的每一个延迟会传播到后续的任务的执行。
	 * 对应Timer中的schedule(TimerTask task, Date firstTime, long period)
	 */
	public static final int Schedule_Date_Period=2;
	
	/**
	 * 指定时间开始周期运行(基于固定比率)
	 * 用固定比率调度。使用本方法时,所有后续执行根据初始执行的时间进行调度,从而希望减小延迟
	 * 如果由于任何原因(如业务逻辑复杂、垃圾回收或其他后台活动)而延迟了某次执行,则将快速连续地出现两次或更多次执行,从而使后续执行能够赶上来
	 * 对应Tiemr中的scheduleAtFixedRate(TimerTask task, Date firstTime, long period) 
	 */
	public static final int FixedRate_Date=3;
	
	/**
	 * 指定延迟开始运行(基于固定比率)
	 * 用固定比率调度。使用本方法时,所有后续执行根据初始执行的时间进行调度,从而希望减小延迟
	 * 如果由于任何原因(如业务逻辑复杂、垃圾回收或其他后台活动)而延迟了某次执行,则将快速连续地出现两次或更多次执行,从而使后续执行能够赶上来
	 * 对应Timer中的scheduleAtFixedRate(TimerTask task, long delay, long period)
	 */
	public static final int FixedRate_Period=4;
	
	public BaseTimerTask(int type){
		this.type = type;
	}
	
	public void run() {}
	
}

 2、定时器类:

package com.sxit.common;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Timer;

/**
 * @功能:定时器基类
 * @作者: smile
 * @时间:2013-3-28 下午3:39:15
 * @版本:1.0
 */
public class BaseTimer extends Timer {

	// Timer队列
	private static Map<String, BaseTimerTask> timerMap = new HashMap<String, BaseTimerTask>();

	private static BaseTimer timer = new BaseTimer();

	private BaseTimer() {
	}

	public static BaseTimer getInstance() {
		return timer;
	}

	// 向队列中添加Timer
	public void addTimer(String timerName, BaseTimerTask task) {
		timerMap.put(timerName, task);
	}

	// 启动Timer
	public synchronized void startTask() {
		if (timerMap != null) {
			Iterator<String> itr = timerMap.keySet().iterator();
			while (itr.hasNext()) {
				Object obj = itr.next();
				BaseTimerTask task = timerMap.get(obj.toString());
				if (task.type == BaseTimerTask.Schedule_Date) {
					this.schedule(task, task.runTime);
				} else if (task.type == BaseTimerTask.Schedule_Date_Period) {
					this.schedule(task, task.runTime, task.period);
				} else if (task.type == BaseTimerTask.FixedRate_Date) {
					this.scheduleAtFixedRate(task, task.runTime, task.period);
				} else if (task.type == BaseTimerTask.FixedRate_Period) {
					this.scheduleAtFixedRate(task, task.delay, task.period);
				} else {
					// 配置信息不正确 退出
					System.exit(0);
				}
			}
		}
	}

	// 销毁Timer
	public synchronized void stopTask() {
		if (timerMap != null) {
			Iterator<String> itr = timerMap.keySet().iterator();
			while (itr.hasNext()) {
				Object obj = itr.next();
				BaseTimerTask task = timerMap.get(obj.toString());
				if(task != null){
					task.cancel();
				}
			}
		}
	}

}

 3、容器启动时加载Timer配置文件

package com.sxit.common;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.Properties;

/**
 * @功能:Web容器启动 装载Timer信息
 * @作者: smile
 * @时间:2013-3-28 下午3:50:25
 * @版本:1.0
 */
public class TimerConfig {

	private static TimerConfig timerConfig = new TimerConfig();
	// Timer配置文件名
	private static String fileName = "mainTimer.properties";

	private static Properties config = new Properties();

	private TimerConfig() {
		init();
	}

	public static TimerConfig getInstance() {
		return timerConfig;
	}

	// 加载配置Timer配置文件
	public void init() {

		InputStream is = null;
		try {
			URL url = Thread.currentThread().getContextClassLoader().getResource("");
			File f = new File(url.getPath() + File.separator + fileName);
			is = new FileInputStream(f);
			config.clear();
			config.load(is);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (is != null) {
				try {
					is.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}

	// 向队列中添加Timer
	public void setTask() {

		try {
			if (config != null && config.size() > 0) {

				BaseTimer timer = BaseTimer.getInstance();
				Iterator itr = config.keySet().iterator();
				while (itr.hasNext()) {
					Object obj = itr.next();
					// 配置文件格式
					// Timer名 = Timer类路径,Timer类型,执行时间,执行周期,延迟时间
					String[] tmp = config.get(obj).toString().split(",");
					int type = Integer.parseInt(tmp[1]);
					// 通过反射生成指定Timer类的对象 并给type赋值
					BaseTimerTask task = (BaseTimerTask) Class.forName(tmp[0]).getConstructor(new Class[] { Integer.TYPE }).newInstance(new Object[] { type });
					if (type == BaseTimerTask.Schedule_Date) {
						task.runTime = parseTime(tmp[2]);
					} else if (type == BaseTimerTask.Schedule_Date_Period) {
						task.runTime = parseTime(tmp[2]);
						task.period = Long.parseLong(tmp[3]);
					} else if (type == BaseTimerTask.FixedRate_Date) {
						task.runTime = parseTime(tmp[2]);
						task.period = Long.parseLong(tmp[3]);
					} else if (type == BaseTimerTask.FixedRate_Period) {
						task.runTime = parseTime(tmp[2]);
						task.delay = Long.parseLong(tmp[4]);
					} else {
						System.exit(0);// 配置文件出错
					}
					timer.addTimer(obj.toString(), task);// 添加Timer到队列中
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	//字符串转换Date
	public Date parseTime(String s) throws ParseException {
		SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");
		return format.parse(s);
	}

}

 4、监听器:

package com.sxit.util;

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

import com.sxit.common.BaseTimer;
import com.sxit.common.TimerConfig;

public class ContextListener implements ServletContextListener {
	
	/**
	 * Web容器初始化
	 */
	public void contextInitialized(ServletContextEvent sce) {
		
		BaseTimer.getInstance().stopTask();
	}
	
	/**
	 * Web容器销毁
	 */
	public void contextDestroyed(ServletContextEvent sce) {
		
		//读取Timer配置文件 并加入到队列中
		TimerConfig.getInstance().setTask();
		
		//启动Timer
		BaseTimer.getInstance().startTask();
	}
}

 5、测试Timer:

package com.sxit.timertask;

import com.sxit.common.BaseTimerTask;

public class TestTask extends BaseTimerTask {
	
	public TestTask(int type) {
		super(type);
	}
	
	public void run() {
		System.out.println("这里执行任务");
	}
	
}

 6、Timer配置文件:

#增值业务用户导入
#ImportCpUserTimerTask=ImportCpUserTimerTask,timertask.imports.ImportCpUserTimerTask,2,1000,5000

#未定制用户导入
#ImportUnOrderUserTimerTask=ImportUnOrderUserTimerTask,timertask.imports.ImportUnOrderUserTimerTask,2,1000,5000

#增值业务日报表
#CpUserDayTimerTask=CpUserDayTimerTask,timertask.businessRpt.CpUserDayTimerTask,5,05:33:00,86400000

#亲情号码按班级导入
#ImportFamilyMobileTaskNew=ImportManage,timertask.imports.familymobile.ImportFamilyMobileTaskNew,2,1000,50000

#定时解析10086的投诉文档
#UsercomplaintTimerTask=UsercomplaintTimerTask,timertask.businessRpt.UsercomplaintTimerTask,1,09:45:00,86400000

#定时解析10086的投诉文档(new)
#UserComplaintTimerTaskNew=UserComplaintTimerTaskNew,timertask.businessRpt.UserComplaintTimerTaskNew,1,03:00:00,86400000

#异网用户导入
ImportYwUserTimerTask=ImportYwUserTimerTask,timertask.imports.ImportYwUserTimerTask,2,1000,5000
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    【PHP定时任务】基于thinkphp定时任务计划任务.zip

    【PHP定时任务】基于thinkphp定时任务计划任务.zip 【PHP定时任务】基于thinkphp定时任务计划任务.zip 【PHP定时任务】基于thinkphp定时任务计划任务.zip 【PHP定时任务】基于thinkphp定时任务计划任务.zip 【PHP...

    java定时任务调度之Timer 简单示例

    在本文中,我们将深入探讨`Timer`类的基本使用和示例,帮助你理解如何在Java程序中实现简单的定时任务。 首先,`Timer`类提供了计划任务的能力,它可以按照预定的时间间隔安排任务执行。创建一个`Timer`对象后,你...

    Spring使用timer定时器-能精确几点运行定时任务

    Spring提供了多种方式来实现定时任务,其中之一就是使用`Timer`。`Timer`接口源自Java标准库,但在Spring中,我们可以结合它来创建更加灵活的定时任务。本教程将详细介绍如何在Spring中使用`Timer`来实现能精确到几...

    Timer定时任务

    《Timer定时任务详解》 在计算机编程中,定时任务是一项重要的功能,它允许程序在特定的时间间隔或预定的时间点执行特定的操作。Java中的`java.util.Timer`类和`java.util.TimerTask`类为我们提供了实现定时任务的...

    java定时任务,每天定时执行任务

    Java 定时任务是指在 Java 语言中实现的定时执行任务的机制,通过使用 Timer 和 TimerTask 两个类,可以实现定时执行任务的功能。在这个例子中,我们将实现每天定时执行任务的功能,具体来说,就是在每天的凌晨 2 点...

    Spring的定时任务开发及对Quartz和Timer支持

    在【标题】"Spring的定时任务开发及对Quartz和Timer支持"中,涉及到的是Spring在处理定时任务方面的特性,这在企业级应用中非常常见,用于执行一些周期性的后台任务,如数据同步、报表生成、清理任务等。 首先,...

    java轻松实现—定时任务

    在Java中,我们可以利用`java.util.Timer`类和`java.util.TimerTask`类来实现简单的定时任务,但这种实现方式存在线程安全问题。在Web应用中,我们可以利用Servlet容器提供的特性来更优雅地处理定时任务,这就是描述...

    tp(worder_timer)定时任务,访问url_thinkphp_定时任务_TP_

    ThinkPHP是一个广受欢迎的PHP框架,而"tp(worder_timer)定时任务,访问url_thinkphp_定时任务_TP_"则涉及到在ThinkPHP框架下实现定时任务的功能。下面我们将详细探讨这个主题。 一、ThinkPHP框架 ThinkPHP(简称TP...

    C#实现的自定义定时任务 可定时运行 多任务运行

    本文将深入探讨如何使用C#语言来实现一个自定义的定时任务系统,支持多任务运行,以便更好地满足开发中的各种场景。 首先,我们需要理解C#中的基础定时器类`System.Timers.Timer`和`System.Threading.Timer`。这两...

    基于thinkphp框架的定时器(定时执行任务)

    除了Cron,还可以使用第三方定时任务库如`EasySwoole`或`Workerman`,它们提供了更丰富的定时任务管理功能,并且可以在无需Cron的情况下运行。 五、注意事项 - 定时任务的执行效率和稳定性至关重要,因此要确保任务...

    Java里timer执行定时任务

    例如,可以在 `init()` 方法中使用 `Timer` 或者使用 Servlet 容器支持的定时任务机制,如Quartz Scheduler 或 Spring 的 `@Scheduled` 注解。这种方式更适用于企业级应用,因为它能够更好地集成到现有的应用环境中...

    简单的定时任务 .NETCore3.1 WorkerService.zip

    这个压缩包 "简单的定时任务 .NETCore3.1 WorkerService.zip" 包含了一个名为 "NetCoreWorkerService-master" 的项目,该项目是一个示例,展示了如何在 Windows 和 Linux 上使用 Worker Service 来执行定期任务。...

    Spring 框架自带定时任务和Quartz定时任务

    首先,对于Java自带的定时任务实现,我们可以使用java.util.Timer和java.util.TimerTask类。Timer类负责安排在后台线程上的TimerTask任务的执行。TimerTask是一个抽象类,我们需要创建它的一个子类,并重写run方法来...

    C#定时任务winfrom

    "C#定时任务winform"是指使用C#语言构建的基于Windows Forms(WinForm)的应用程序,该应用具有定时执行任务的功能。这通常涉及到System.Timers.Timer或System.Threading.Timer类的使用,它们允许开发者在特定时间...

    C# 用Timer实现定时任务程序

    C# 用Timer实现定时任务程序 初学者参考使用

    asp.net定时任务(定时器)

    ASP.NET定时任务通常基于`System.Threading.Timer`类或者`System.Timers.Timer`类来实现。这两个类都提供了周期性触发事件的能力。在ASP.NET中,我们可以创建一个后台线程或使用`HttpApplication`的生命周期事件来...

    Tomcat的定时任务(计时器)

    本文将深入探讨如何在Tomcat中实现定时任务,主要涉及的知识点包括Java的定时器(Timer)和Spring框架的TaskScheduler。 首先,让我们了解一下Java中的定时任务。在Java标准库中,有一个名为`java.util.Timer`的类...

    java定时任务Timer和TimerTask使用详解

    如果你是在Web环境下使用定时任务,可以将任务的初始化放在一个监听器(如 `ServletContextListener`)中,这样服务器启动时就会自动执行。例如,在 `web.xml` 中配置: ```xml &lt;listener-class&gt;...

Global site tag (gtag.js) - Google Analytics