⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cronfactory.java

📁 电信的网厅的整站代码
💻 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 + -