package com.github.looly.hutool;
import com.github.looly.hutool.exceptions.UtilException;
import it.sauronsoftware.cron4j.Scheduler;
import java.util.Map.Entry;
import org.slf4j.Logger;
/**
* 定时任务工具类
* @author xiaoleilu
*
*/
public class CronUtil {
private static Logger log = Log.get();
/** Crontab配置文件 */
public final static String CRONTAB_CONFIG_PATH = "config/cron4j.setting";
private final static Scheduler scheduler = new Scheduler();
private static Setting crontab;
/**
* 自定义定时任务配置文件
* @param cronSetting 定时任务配置文件
*/
public static void setCronSetting(Setting cronSetting) {
crontab = cronSetting;
}
/**
* 自定义定时任务配置文件路径
* @param cronSettingPath 定时任务配置文件路径(相对绝对都可)
*/
public static void setCronSetting(String cronSettingPath) {
crontab = new Setting(cronSettingPath, Setting.DEFAULT_CHARSET, false);
}
/**
* 加入定时任务
* @param schedulingPattern 定时任务执行时间的crontab表达式
* @param task 任务
*/
public static void schedule(String schedulingPattern, Runnable task) {
scheduler.schedule(schedulingPattern, task);
}
/**
* 批量加入配置文件中的定时任务
* @param cronSetting 定时任务设置文件
*/
public static void schedule(Setting cronSetting) {
for (Entry<String, String> entry : cronSetting.entrySet()) {
final String jobClass = entry.getKey();
final String pattern = entry.getValue();
try {
final Runnable job = ClassUtil.newInstance(jobClass);
schedule(pattern, job);
log.info("Schedule [{} {}] added.", pattern, jobClass);
} catch (Exception e) {
Log.error(log, e, "Schedule [%s %s] add error!", pattern, jobClass);
}
}
}
/**
* 开始
*/
synchronized public static void start() {
if(null == crontab) {
setCronSetting(CRONTAB_CONFIG_PATH);
}
if(scheduler.isStarted()) {
throw new UtilException("Scheduler has been started, please stop it first!");
}
schedule(crontab);
scheduler.start();
}
/**
* 停止
*/
synchronized public static void stop() {
scheduler.stop();
}
}