📄 cronfactory.java
字号:
package com.doone.fj1w.common;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TimerTask;
import javax.servlet.ServletContext;
import com.doone.util.FileLogger;
/**
* @author janage FIXME 实现系统配置参数的自动刷新(重新加载)及Session或Cache的清除。
*/
public class CronFactory extends TimerTask {
private static Map factory = new HashMap();
private static List minuteList = new ArrayList();
private static List hourList = new ArrayList();
private static List dayList = new ArrayList();
private static List weekList = new ArrayList();
private static List monthList = new ArrayList();
private ServletContext context = null;
private boolean isRun = false;
CronFactory(ServletContext arg0) {
this.context = arg0;
}
public void run() {
if (!isRun) {
// 避免重入情况。
isRun = true;
try {
everyMinute();
everyHour();
everyDay();
everyWeek();
everyMonth();
}
catch (Exception ex) {
FileLogger.getLogger().warn("任务执行异常:", ex);
}
isRun = false;
}
}
private void everyMinute() {
for (int i = 0; i < minuteList.size(); i++) {
// 让每个任务不受影响。
try {
TaskType tt = (TaskType) minuteList.get(i);
if (tt.currMinute <= 0) {
// 开始执行任务。
Class[] pt = tt.method.getParameterTypes();
if (pt.length == 0) {
tt.method.invoke(null, null);
}
else if (pt.length == 1 && pt[0] == ServletContext.class) {
Object[] obj = new Object[1];
obj[0] = context;
tt.method.invoke(null, obj);
}
tt.runCount++;
tt.lastTime = new Date();
tt.currMinute = tt.maxMinute;
}
else {
if (tt.currMinute > 0) tt.currMinute--;
}
}
catch (Exception ex) {
FileLogger.getLogger().warn("每分钟任务执行异常:", ex);
}
}
}
private void everyHour() {
for (int i = 0; i < hourList.size(); i++) {
// 让每个任务不受影响。
try {
TaskType tt = (TaskType) hourList.get(i);
Calendar cal = Calendar.getInstance();
long currTime = cal.getTimeInMillis();
cal.setTime(tt.lastTime);
cal.add(Calendar.HOUR, 1);
long lastTime = cal.getTimeInMillis();
if (tt.currMinute <= 0 && currTime >= lastTime) {
// 开始执行任务。
Class[] pt = tt.method.getParameterTypes();
if (pt.length == 0) {
tt.method.invoke(null, null);
}
else if (pt.length == 1 && pt[0] == ServletContext.class) {
Object[] obj = new Object[1];
obj[0] = context;
tt.method.invoke(null, obj);
}
tt.runCount++;
cal = Calendar.getInstance();
cal.set(Calendar.MINUTE,0);
cal.set(Calendar.SECOND,0);
tt.lastTime = cal.getTime();
tt.currMinute = tt.maxMinute;
}
else {
if (tt.currMinute > 0 && lastTime - currTime <= tt.maxMinute) tt.currMinute--;
}
}
catch (Exception ex) {
FileLogger.getLogger().warn("每小时任务执行异常:", ex);
}
}
}
private void everyDay() {
for (int i = 0; i < dayList.size(); i++) {
// 让每个任务不受影响。
try {
TaskType tt = (TaskType) dayList.get(i);
Calendar cal = Calendar.getInstance();
long currTime = cal.getTimeInMillis();
cal.setTime(tt.lastTime);
cal.add(Calendar.DATE, 1);
long lastTime = cal.getTimeInMillis();
if (tt.currMinute <= 0 && currTime >= lastTime) {
// 开始执行任务。
Class[] pt = tt.method.getParameterTypes();
if (pt.length == 0) {
tt.method.invoke(null, null);
}
else if (pt.length == 1 && pt[0] == ServletContext.class) {
Object[] obj = new Object[1];
obj[0] = context;
tt.method.invoke(null, obj);
}
tt.runCount++;
cal = Calendar.getInstance();
cal.set(Calendar.MINUTE,0);
cal.set(Calendar.SECOND,0);
cal.set(Calendar.HOUR_OF_DAY,0);
tt.lastTime = cal.getTime();
tt.currMinute = tt.maxMinute;
}
else {
if (tt.currMinute > 0 && lastTime - currTime <= tt.maxMinute) tt.currMinute--;
}
}
catch (Exception ex) {
FileLogger.getLogger().warn("每天的任务执行异常:", ex);
}
}
}
private void everyWeek() {
for (int i = 0; i < weekList.size(); i++) {
// 让每个任务不受影响。
try {
TaskType tt = (TaskType) weekList.get(i);
Calendar cal = Calendar.getInstance();
long currTime = cal.getTimeInMillis();
cal.setTime(tt.lastTime);
cal.add(Calendar.WEEK_OF_YEAR, 1);
long lastTime = cal.getTimeInMillis();
if (tt.currMinute <= 0 && currTime >= lastTime) {
// 开始执行任务。
Class[] pt = tt.method.getParameterTypes();
if (pt.length == 0) {
tt.method.invoke(null, null);
}
else if (pt.length == 1 && pt[0] == ServletContext.class) {
Object[] obj = new Object[1];
obj[0] = context;
tt.method.invoke(null, obj);
}
tt.runCount++;
cal = Calendar.getInstance();
cal.set(Calendar.MINUTE,0);
cal.set(Calendar.SECOND,0);
cal.set(Calendar.HOUR_OF_DAY,0);
cal.set(Calendar.DAY_OF_WEEK,Calendar.SUNDAY);
tt.lastTime = cal.getTime();
tt.currMinute = tt.maxMinute;
}
else {
if (tt.currMinute > 0 && lastTime - currTime <= tt.maxMinute) tt.currMinute--;
}
}
catch (Exception ex) {
FileLogger.getLogger().warn("每周的任务执行异常:", ex);
}
}
}
private void everyMonth() {
for (int i = 0; i < monthList.size(); i++) {
// 让每个任务不受影响。
try {
TaskType tt = (TaskType) monthList.get(i);
Calendar cal = Calendar.getInstance();
long currTime = cal.getTimeInMillis();
cal.setTime(tt.lastTime);
cal.add(Calendar.MONTH, 1);
long lastTime = cal.getTimeInMillis();
if (tt.currMinute <= 0 && currTime >= lastTime) {
// 开始执行任务。
Class[] pt = tt.method.getParameterTypes();
if (pt.length == 0) {
tt.method.invoke(null, null);
}
else if (pt.length == 1 && pt[0] == ServletContext.class) {
Object[] obj = new Object[1];
obj[0] = context;
tt.method.invoke(null, obj);
}
tt.runCount++;
cal = Calendar.getInstance();
cal.set(Calendar.MINUTE,0);
cal.set(Calendar.SECOND,0);
cal.set(Calendar.HOUR_OF_DAY,0);
cal.set(Calendar.DAY_OF_MONTH,1);
tt.lastTime = cal.getTime();
tt.currMinute = tt.maxMinute;
}
else {
if (tt.currMinute > 0 && lastTime - currTime <= tt.maxMinute) tt.currMinute--;
}
}
catch (Exception ex) {
FileLogger.getLogger().warn("每月的任务执行异常:", ex);
}
}
}
/**
* 注册一个方法,让系统按指定时间执行该方法。
*
* @param cronType
* 指定执行的类型;
* @param method
* 将要执行的方法引用,必须是没有参数的静态方法。
* @param count
* 计数次数或分钟数:
* 如果cronType为EVERY_MINUTE,则count为计数次数,例如count=10时,表示10分钟执行一次。
* 否则count为分钟数,例如:cronType为EVERY_HOUR,count=10,表示每小时的第10分钟执行一次。
*/
public static void regMethod(int cronType, Method method, int count) {
try {
if (method == null) throw new NullPointerException("方法不能为空。");
if (!Modifier.isStatic(method.getModifiers())) {
throw new IllegalArgumentException("方法必须是静态方法。");
}
if (factory.get(method.getName().toLowerCase()) != null) {
throw new RuntimeException("方法已经存在,不能再次初始化。");
}
TaskType tt = new TaskType();
tt.method = method;
tt.cronType = cronType;
tt.currMinute = count;
tt.maxMinute = count;
Calendar cal = Calendar.getInstance();
switch (cronType) {
case CronFactory.EVERY_MINUTE:
factory.put(method.getName().toLowerCase(), tt);
minuteList.add(tt);
break;
case CronFactory.EVERY_HOUR:
// 设置为每小时第0分钟第0秒开始。
cal.set(Calendar.MINUTE,0);
cal.set(Calendar.SECOND,0);
tt.lastTime = cal.getTime();
factory.put(method.getName().toLowerCase(), tt);
hourList.add(tt);
break;
case CronFactory.EVERY_DAY:
// 设置为每天的0时0分0秒
cal.set(Calendar.MINUTE,0);
cal.set(Calendar.SECOND,0);
cal.set(Calendar.HOUR_OF_DAY,0);
tt.lastTime = cal.getTime();
factory.put(method.getName().toLowerCase(), tt);
dayList.add(tt);
break;
case CronFactory.EVERY_WEEK:
// 设置为每天的0时0分0秒
cal.set(Calendar.MINUTE,0);
cal.set(Calendar.SECOND,0);
cal.set(Calendar.HOUR_OF_DAY,0);
cal.set(Calendar.DAY_OF_WEEK,Calendar.SUNDAY);
tt.lastTime = cal.getTime();
factory.put(method.getName().toLowerCase(), tt);
weekList.add(tt);
break;
case CronFactory.EVERY_MONTH:
// 将每月设置为从每月的1日0时0分开始。
cal.set(Calendar.MINUTE,0);
cal.set(Calendar.SECOND,0);
cal.set(Calendar.HOUR_OF_DAY,0);
cal.set(Calendar.DAY_OF_MONTH,1);
tt.lastTime = cal.getTime();
factory.put(method.getName().toLowerCase(), tt);
monthList.add(tt);
break;
default:
throw new RuntimeException("错误的计划类型。");
}
}
catch (RuntimeException ex) {
FileLogger.getLogger().warn(ex.getMessage(), ex);
// 内部异常,忽略错误。
}
catch (Exception ex) {
FileLogger.getLogger().error("注册方法失败,", ex);
throw new RuntimeException(ex);
}
}
/**
* 移除指定方法的定时任务。
*
* @param method
* 指定方法的引用。
*/
public static void removeMethod(Method method) {
if (method == null) throw new NullPointerException("参数不能为空。");
try {
TaskType tt = (TaskType) factory.get(method.getName().toLowerCase());
if (tt == null) {
FileLogger.getLogger().warn("指定方法没有注册或已经初移除:" + method.getName());
}
else {
factory.remove(method.getName().toLowerCase());
switch (tt.cronType) {
case CronFactory.EVERY_MINUTE:
minuteList.remove(tt);
break;
case CronFactory.EVERY_HOUR:
hourList.remove(tt);
break;
case CronFactory.EVERY_DAY:
dayList.remove(tt);
break;
case CronFactory.EVERY_WEEK:
weekList.remove(tt);
break;
case CronFactory.EVERY_MONTH:
monthList.remove(tt);
break;
default:
throw new RuntimeException("错误的计划类型。");
}
}
}
catch (RuntimeException ex) {
FileLogger.getLogger().warn(ex.getMessage(), ex);
}
}
public static final int EVERY_MINUTE = 0;
public static final int EVERY_HOUR = 1;
public static final int EVERY_DAY = 2;
public static final int EVERY_WEEK = 3;
public static final int EVERY_MONTH = 4;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -