通用定时任务
import java.util.Map;
import org.ofbiz.entity.GenericValue;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import com.housekeeper.myListener.utils.MyDateUtil;
import com.housekeeper.myListener.utils.MyDelegatorUtil;
import woxiang.quartz.InQuartzMain;
import woxiang.util.QuartzManager;
import woxiang.util.SystemUtil;
public class JobQuartzTask implements Job {
private static final String JOB_GROUP = "JOB_MAIN";
private static final String TRIGGER_GROUP = "TRIGGER_MAIN";
protected static Map<String,GenericValue> map;
/**
* 监听定时调度表数据,自动添加定时任务
* 1.项目启动
* 自动根据定时表数据,启动定时调度
* 2.项目启动中
* 2.1 删除定时任务
* 任务启动中,定时任务中删除任务
* 任务未启动,不做任何操作
* 2.2 修改定时任务
* 任务启动中,修改定时任务
* 任务未启动,不做任何操作
* 2.3 新增定时任务
*
* @author Alex
* @version 创建时间:2018年8月28日 下午7:36:06
*/
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
String ip = SystemUtil.getServerLocalIp();
try {
//1.判断是否第一次启动定时调度
if (map == null) {
//map缓存定时调度表中数据
map = MyDelegatorUtil.mapFromEntity(InQuartzMain.delegator, "Meta_schedule", "Meta_scheduleId");
//根据map中的key获取每个数据
for (String key : map.keySet()) {
GenericValue lis = map.get(key);
String Meta_ips = lis.getString("Meta_ips"); //运行服务器IPs
String Meta_tiggerType = lis.getString("Meta_tiggerType"); //触发类型
String Meta_classpath = lis.getString("Meta_classpath"); //触发类路径
String Meta_nameEnglish = lis.getString("Meta_nameEnglish"); //任务名称
String Meta_triggerName = lis.getString("Meta_triggerName"); //触发器名
String Meta_exp = lis.getString("Meta_exp"); //触发时间
String Meta_scheduleStatus = lis.getString("Meta_scheduleStatus"); //触发状态
//判断是否允许使用定时调度
if (Meta_ips.indexOf(ip) != -1 && "running".equals(Meta_scheduleStatus)){
if ("CLASSPATH".equals(Meta_tiggerType)) {
//添加任务
Class jobClass = Class.forName(Meta_classpath);
QuartzManager.addJob(Meta_nameEnglish, JOB_GROUP, Meta_triggerName, TRIGGER_GROUP, jobClass, Meta_exp);
//定时启动后修改任务上次运行状态和运行时间
MyDelegatorUtil.updateBySQL(InQuartzMain.delegator, "update meta_schedule set META_LAST_STATUS_RUNNING = 'normal',"
+ "META_LAST_TIME_RUNNING = '" + MyDateUtil.getCurrentDateByYMDHMS()+
"' where META_SCHEDULE_ID = '" + key + "'");
}
}
}
//2.通过map缓存,查看任务是否修改
}else {
//加载最新定时调度表中数据
Map<String,GenericValue> mapNew = MyDelegatorUtil.mapFromEntity(InQuartzMain.delegator, "Meta_schedule", "Meta_scheduleId");
for (String key : map.keySet()) {
GenericValue newList = mapNew.get(key); //新数据
GenericValue oldList = map.get(key); //旧数据
//2.1判断该定时任务是否已删除
if (newList == null) {
String Meta_nameEnglish = oldList.getString("Meta_nameEnglish"); //任务名称
String Meta_triggerName = oldList.getString("Meta_triggerName"); //触发器名
String Meta_ips = oldList.getString("Meta_ips"); //运行服务器IPs
String Meta_tiggerType = oldList.getString("Meta_tiggerType"); //触发类型
String Meta_scheduleStatus = oldList.getString("Meta_scheduleStatus"); //触发状态
//判断是否允许使用定时调度
if (Meta_ips.indexOf(ip) != -1 && "running".equals(Meta_scheduleStatus)) {
if ("CLASSPATH".equals(Meta_tiggerType)) {
//删除任务
QuartzManager.removeJob(Meta_nameEnglish, JOB_GROUP, Meta_triggerName, TRIGGER_GROUP);
}
}
}else {
String Meta_lastTimeRunning = newList.getString("Meta_lastTimeRunning"); //获取任务最后运行时间
//2.2判断定时任务是否修改
if (Meta_lastTimeRunning == null || Meta_lastTimeRunning.isEmpty()) {
String Meta_nameEnglish = newList.getString("Meta_nameEnglish"); //任务名称
String Meta_triggerName = newList.getString("Meta_triggerName"); //触发器名
String Meta_ips = newList.getString("Meta_ips"); //运行服务器IPs
String Meta_tiggerType = newList.getString("Meta_tiggerType"); //触发类型
String Meta_exp = newList.getString("Meta_exp"); //触发时间
String Meta_classpath = newList.getString("Meta_classpath"); //触发类路径
String Meta_scheduleStatusNew = newList.getString("Meta_scheduleStatus"); //触发状态
String Meta_scheduleStatusOld = oldList.getString("Meta_scheduleStatus"); //触发状态
//判断任务最新状态
if ("running".equals(Meta_scheduleStatusNew)) {
//判断任务之前状态,如运行状态,将修改任务
if (Meta_ips.indexOf(ip) != -1 && "running".equals(Meta_scheduleStatusOld)) {
if ("CLASSPATH".equals(Meta_tiggerType)) {
//修改任务
QuartzManager.modifyJobTime(Meta_nameEnglish, JOB_GROUP, Meta_triggerName, TRIGGER_GROUP, Meta_exp);
//定时启动后修改任务上次运行状态和运行时间
MyDelegatorUtil.updateBySQL(InQuartzMain.delegator, "update meta_schedule set META_LAST_STATUS_RUNNING = 'normal',"
+ "META_LAST_TIME_RUNNING = '" + MyDateUtil.getCurrentDateByYMDHMS() +
"' where META_SCHEDULE_ID = '" + key + "'");
}
}else if (Meta_ips.indexOf(ip) != -1 && !"running".equals(Meta_scheduleStatusOld)) {
//之前状态不为运行运行状态,添加任务
Class jobClass = Class.forName(Meta_classpath);
QuartzManager.addJob(Meta_nameEnglish, JOB_GROUP, Meta_triggerName, TRIGGER_GROUP, jobClass, Meta_exp);
//定时启动后修改任务上次运行状态和运行时间
MyDelegatorUtil.updateBySQL(InQuartzMain.delegator, "update meta_schedule set META_LAST_STATUS_RUNNING = 'normal',"
+ "META_LAST_TIME_RUNNING = '"+ MyDateUtil.getCurrentDateByYMDHMS() +
"' where META_SCHEDULE_ID = '" + key + "'");
}else {
}
}else {
//判断任务之前状态,如运行状态,将任务从定时器中删除
if (Meta_ips.indexOf(ip) != -1 && "running".equals(Meta_scheduleStatusOld)) {
if ("CLASSPATH".equals(Meta_tiggerType)) {
//通过job监听
QuartzManager.removeJob(Meta_nameEnglish, JOB_GROUP, Meta_triggerName, TRIGGER_GROUP);
//定时启动后修改任务上次运行状态和运行时间
MyDelegatorUtil.updateBySQL(InQuartzMain.delegator, "update meta_schedule set META_LAST_STATUS_RUNNING = 'normal',"
+ "META_LAST_TIME_RUNNING = '" + MyDateUtil.getCurrentDateByYMDHMS() +
"' where META_SCHEDULE_ID = '" + key + "'");
}
}
}
}
}
}
//2.3.通过新数据查看是否有新增数据
for (String key : mapNew.keySet()) {
GenericValue oldList = map.get(key); //旧数据
GenericValue newList = mapNew.get(key); //新数据
//判断该定时任务是否新增
if (oldList == null) {
//新增任务
String Meta_ips = newList.getString("Meta_ips"); //运行服务器IPs
String Meta_tiggerType = newList.getString("Meta_tiggerType"); //触发类型
String Meta_classpath = newList.getString("Meta_classpath"); //触发类路径
String Meta_nameEnglish = newList.getString("Meta_nameEnglish"); //任务名称
String Meta_triggerName = newList.getString("Meta_triggerName"); //触发器名
String Meta_exp = newList.getString("Meta_exp"); //触发时间
String Meta_scheduleStatus = newList.getString("Meta_scheduleStatus"); //触发状态
//判断是否允许使用定时调度
if (Meta_ips.indexOf(ip) != -1 && "running".equals(Meta_scheduleStatus)){
if ("CLASSPATH".equals(Meta_tiggerType)) {
//通过job监听
Class jobClass = Class.forName(Meta_classpath);
QuartzManager.addJob(Meta_nameEnglish, JOB_GROUP, Meta_triggerName, TRIGGER_GROUP, jobClass, Meta_exp);
//定时启动后修改任务上次运行状态和运行时间
MyDelegatorUtil.updateBySQL(InQuartzMain.delegator, "update meta_schedule set META_LAST_STATUS_RUNNING = 'normal',"
+ "META_LAST_TIME_RUNNING = '" + MyDateUtil.getCurrentDateByYMDHMS()+
"' where META_SCHEDULE_ID = '" + key + "'");
}
}
}
}
map = MyDelegatorUtil.mapFromEntity(InQuartzMain.delegator, "Meta_schedule", "Meta_scheduleId");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
- 第十一节: 封装通用的定时调度框架,实现新增、删除、开启、暂停计划任务:
- linux 定时任务
- 【服务器】JavaWeb配置Servlet定时任务
- Spring结合Quartz实现多任务定时调用(转)
- Java 实现定时任务的四种方式
- PHP定时执行计划任务
- Linux 定时任务
- linux定时任务的设置
- 系统延时任务与定时任务
- crontab 定时任务
- mysql数据库的定时任务
- anacron实现异步定时任务调度
- Spring整合Quartz定时任务 在集群、分布式系统中的应用
- Android中实现定时周期任务的方法
- springboot系列文章(四)——fastjson、定时任务、全局异常配置
- 个人的定时任务 测试
- STM32-通用定时器基本定时功能
- Window环境定时执行任务
- oracle 10g 定时任务
- PHP 之 定时任务