|
|
|
@ -9,29 +9,33 @@ import com.xxl.job.admin.dao.XxlJobInfoDao; |
|
|
|
|
import com.xxl.job.admin.dao.XxlJobLogDao; |
|
|
|
|
import com.xxl.job.admin.dao.XxlJobRegistryDao; |
|
|
|
|
import com.xxl.job.core.biz.AdminBiz; |
|
|
|
|
import com.xxl.job.core.biz.ExecutorBiz; |
|
|
|
|
import com.xxl.job.core.rpc.netcom.NetComClientProxy; |
|
|
|
|
import com.xxl.job.core.rpc.netcom.NetComServerFactory; |
|
|
|
|
import org.quartz.*; |
|
|
|
|
import org.quartz.Trigger.TriggerState; |
|
|
|
|
import org.quartz.impl.matchers.GroupMatcher; |
|
|
|
|
import org.quartz.impl.triggers.CronTriggerImpl; |
|
|
|
|
import org.slf4j.Logger; |
|
|
|
|
import org.slf4j.LoggerFactory; |
|
|
|
|
import org.springframework.beans.BeansException; |
|
|
|
|
import org.springframework.beans.factory.InitializingBean; |
|
|
|
|
import org.springframework.context.ApplicationContext; |
|
|
|
|
import org.springframework.context.ApplicationContextAware; |
|
|
|
|
import org.springframework.util.Assert; |
|
|
|
|
|
|
|
|
|
import java.util.*; |
|
|
|
|
import java.util.Date; |
|
|
|
|
import java.util.HashSet; |
|
|
|
|
import java.util.concurrent.ConcurrentHashMap; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* base quartz scheduler util |
|
|
|
|
* @author xuxueli 2015-12-19 16:13:53 |
|
|
|
|
*/ |
|
|
|
|
public final class XxlJobDynamicScheduler implements ApplicationContextAware, InitializingBean { |
|
|
|
|
public final class XxlJobDynamicScheduler implements ApplicationContextAware { |
|
|
|
|
private static final Logger logger = LoggerFactory.getLogger(XxlJobDynamicScheduler.class); |
|
|
|
|
|
|
|
|
|
// Scheduler
|
|
|
|
|
|
|
|
|
|
// ---------------------- param ----------------------
|
|
|
|
|
|
|
|
|
|
// scheduler
|
|
|
|
|
private static Scheduler scheduler; |
|
|
|
|
public void setScheduler(Scheduler scheduler) { |
|
|
|
|
XxlJobDynamicScheduler.scheduler = scheduler; |
|
|
|
@ -42,25 +46,41 @@ public final class XxlJobDynamicScheduler implements ApplicationContextAware, In |
|
|
|
|
public void setAccessToken(String accessToken) { |
|
|
|
|
this.accessToken = accessToken; |
|
|
|
|
} |
|
|
|
|
public static String getAccessToken() { |
|
|
|
|
return accessToken; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// init
|
|
|
|
|
// dao
|
|
|
|
|
public static XxlJobLogDao xxlJobLogDao; |
|
|
|
|
public static XxlJobInfoDao xxlJobInfoDao; |
|
|
|
|
public static XxlJobRegistryDao xxlJobRegistryDao; |
|
|
|
|
public static XxlJobGroupDao xxlJobGroupDao; |
|
|
|
|
public static AdminBiz adminBiz; |
|
|
|
|
|
|
|
|
|
// ---------------------- applicationContext ----------------------
|
|
|
|
|
@Override |
|
|
|
|
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { |
|
|
|
|
XxlJobDynamicScheduler.xxlJobLogDao = applicationContext.getBean(XxlJobLogDao.class); |
|
|
|
|
XxlJobDynamicScheduler.xxlJobInfoDao = applicationContext.getBean(XxlJobInfoDao.class); |
|
|
|
|
XxlJobDynamicScheduler.xxlJobRegistryDao = applicationContext.getBean(XxlJobRegistryDao.class); |
|
|
|
|
XxlJobDynamicScheduler.xxlJobGroupDao = applicationContext.getBean(XxlJobGroupDao.class); |
|
|
|
|
XxlJobDynamicScheduler.adminBiz = applicationContext.getBean(AdminBiz.class); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// ---------------------- init + destroy ----------------------
|
|
|
|
|
public void init() throws Exception { |
|
|
|
|
// admin registry monitor run
|
|
|
|
|
// admin registry monitor run
|
|
|
|
|
JobRegistryMonitorHelper.getInstance().start(); |
|
|
|
|
|
|
|
|
|
// admin monitor run
|
|
|
|
|
JobFailMonitorHelper.getInstance().start(); |
|
|
|
|
|
|
|
|
|
// rpc-service, base on spring-mvc
|
|
|
|
|
// admin-server(spring-mvc)
|
|
|
|
|
NetComServerFactory.putService(AdminBiz.class, XxlJobDynamicScheduler.adminBiz); |
|
|
|
|
NetComServerFactory.setAccessToken(accessToken); |
|
|
|
|
|
|
|
|
|
// valid
|
|
|
|
|
Assert.notNull(scheduler, "quartz scheduler is null"); |
|
|
|
|
logger.info(">>>>>>>>> init quartz scheduler success.[{}]", scheduler); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// destroy
|
|
|
|
|
|
|
|
|
|
public void destroy(){ |
|
|
|
|
// admin registry stop
|
|
|
|
|
JobRegistryMonitorHelper.getInstance().toStop(); |
|
|
|
@ -68,64 +88,35 @@ public final class XxlJobDynamicScheduler implements ApplicationContextAware, In |
|
|
|
|
// admin monitor stop
|
|
|
|
|
JobFailMonitorHelper.getInstance().toStop(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// xxlJobLogDao、xxlJobInfoDao
|
|
|
|
|
public static XxlJobLogDao xxlJobLogDao; |
|
|
|
|
public static XxlJobInfoDao xxlJobInfoDao; |
|
|
|
|
public static XxlJobRegistryDao xxlJobRegistryDao; |
|
|
|
|
public static XxlJobGroupDao xxlJobGroupDao; |
|
|
|
|
public static AdminBiz adminBiz; |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { |
|
|
|
|
XxlJobDynamicScheduler.xxlJobLogDao = applicationContext.getBean(XxlJobLogDao.class); |
|
|
|
|
XxlJobDynamicScheduler.xxlJobInfoDao = applicationContext.getBean(XxlJobInfoDao.class); |
|
|
|
|
XxlJobDynamicScheduler.xxlJobRegistryDao = applicationContext.getBean(XxlJobRegistryDao.class); |
|
|
|
|
XxlJobDynamicScheduler.xxlJobGroupDao = applicationContext.getBean(XxlJobGroupDao.class); |
|
|
|
|
XxlJobDynamicScheduler.adminBiz = applicationContext.getBean(AdminBiz.class); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public void afterPropertiesSet() throws Exception { |
|
|
|
|
Assert.notNull(scheduler, "quartz scheduler is null"); |
|
|
|
|
logger.info(">>>>>>>>> init quartz scheduler success.[{}]", scheduler); |
|
|
|
|
|
|
|
|
|
// ---------------------- executor-client ----------------------
|
|
|
|
|
private static ConcurrentHashMap<String, ExecutorBiz> executorBizRepository = new ConcurrentHashMap<String, ExecutorBiz>(); |
|
|
|
|
public static ExecutorBiz getExecutorBiz(String address) throws Exception { |
|
|
|
|
// valid
|
|
|
|
|
if (address==null || address.trim().length()==0) { |
|
|
|
|
return null; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// load-cache
|
|
|
|
|
address = address.trim(); |
|
|
|
|
ExecutorBiz executorBiz = executorBizRepository.get(address); |
|
|
|
|
if (executorBiz != null) { |
|
|
|
|
return executorBiz; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// set-cache
|
|
|
|
|
executorBiz = (ExecutorBiz) new NetComClientProxy(ExecutorBiz.class, address, accessToken).getObject(); |
|
|
|
|
executorBizRepository.put(address, executorBiz); |
|
|
|
|
return executorBiz; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// getJobKeys
|
|
|
|
|
@Deprecated |
|
|
|
|
public static List<Map<String, Object>> getJobList(){ |
|
|
|
|
List<Map<String, Object>> jobList = new ArrayList<Map<String,Object>>(); |
|
|
|
|
|
|
|
|
|
try { |
|
|
|
|
if (scheduler.getJobGroupNames()==null || scheduler.getJobGroupNames().size()==0) { |
|
|
|
|
return null; |
|
|
|
|
} |
|
|
|
|
String groupName = scheduler.getJobGroupNames().get(0); |
|
|
|
|
Set<JobKey> jobKeys = scheduler.getJobKeys(GroupMatcher.jobGroupEquals(groupName)); |
|
|
|
|
if (jobKeys!=null && jobKeys.size()>0) { |
|
|
|
|
for (JobKey jobKey : jobKeys) { |
|
|
|
|
TriggerKey triggerKey = TriggerKey.triggerKey(jobKey.getName(), Scheduler.DEFAULT_GROUP); |
|
|
|
|
Trigger trigger = scheduler.getTrigger(triggerKey); |
|
|
|
|
JobDetail jobDetail = scheduler.getJobDetail(jobKey); |
|
|
|
|
TriggerState triggerState = scheduler.getTriggerState(triggerKey); |
|
|
|
|
Map<String, Object> jobMap = new HashMap<String, Object>(); |
|
|
|
|
jobMap.put("TriggerKey", triggerKey); |
|
|
|
|
jobMap.put("Trigger", trigger); |
|
|
|
|
jobMap.put("JobDetail", jobDetail); |
|
|
|
|
jobMap.put("TriggerState", triggerState); |
|
|
|
|
jobList.add(jobMap); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} catch (SchedulerException e) { |
|
|
|
|
e.printStackTrace(); |
|
|
|
|
return null; |
|
|
|
|
} |
|
|
|
|
return jobList; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// fill job info
|
|
|
|
|
|
|
|
|
|
// ---------------------- schedule util ----------------------
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* fill job info |
|
|
|
|
* |
|
|
|
|
* @param jobInfo |
|
|
|
|
*/ |
|
|
|
|
public static void fillJobInfo(XxlJobInfo jobInfo) { |
|
|
|
|
// TriggerKey : name + group
|
|
|
|
|
String group = String.valueOf(jobInfo.getJobGroup()); |
|
|
|
@ -156,14 +147,28 @@ public final class XxlJobDynamicScheduler implements ApplicationContextAware, In |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// check if exists
|
|
|
|
|
/** |
|
|
|
|
* check if exists |
|
|
|
|
* |
|
|
|
|
* @param jobName |
|
|
|
|
* @param jobGroup |
|
|
|
|
* @return |
|
|
|
|
* @throws SchedulerException |
|
|
|
|
*/ |
|
|
|
|
public static boolean checkExists(String jobName, String jobGroup) throws SchedulerException{ |
|
|
|
|
TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup); |
|
|
|
|
return scheduler.checkExists(triggerKey); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// addJob 新增
|
|
|
|
|
@SuppressWarnings("unchecked") |
|
|
|
|
/** |
|
|
|
|
* addJob |
|
|
|
|
* |
|
|
|
|
* @param jobName |
|
|
|
|
* @param jobGroup |
|
|
|
|
* @param cronExpression |
|
|
|
|
* @return |
|
|
|
|
* @throws SchedulerException |
|
|
|
|
*/ |
|
|
|
|
public static boolean addJob(String jobName, String jobGroup, String cronExpression) throws SchedulerException { |
|
|
|
|
// TriggerKey : name + group
|
|
|
|
|
TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup); |
|
|
|
@ -196,7 +201,15 @@ public final class XxlJobDynamicScheduler implements ApplicationContextAware, In |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// reschedule
|
|
|
|
|
/** |
|
|
|
|
* rescheduleJob |
|
|
|
|
* |
|
|
|
|
* @param jobGroup |
|
|
|
|
* @param jobName |
|
|
|
|
* @param cronExpression |
|
|
|
|
* @return |
|
|
|
|
* @throws SchedulerException |
|
|
|
|
*/ |
|
|
|
|
public static boolean rescheduleJob(String jobGroup, String jobName, String cronExpression) throws SchedulerException { |
|
|
|
|
|
|
|
|
|
// TriggerKey valid if_exists
|
|
|
|
@ -245,7 +258,14 @@ public final class XxlJobDynamicScheduler implements ApplicationContextAware, In |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// unscheduleJob
|
|
|
|
|
/** |
|
|
|
|
* unscheduleJob |
|
|
|
|
* |
|
|
|
|
* @param jobName |
|
|
|
|
* @param jobGroup |
|
|
|
|
* @return |
|
|
|
|
* @throws SchedulerException |
|
|
|
|
*/ |
|
|
|
|
public static boolean removeJob(String jobName, String jobGroup) throws SchedulerException { |
|
|
|
|
// TriggerKey : name + group
|
|
|
|
|
TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup); |
|
|
|
@ -257,7 +277,14 @@ public final class XxlJobDynamicScheduler implements ApplicationContextAware, In |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Pause
|
|
|
|
|
/** |
|
|
|
|
* pause |
|
|
|
|
* |
|
|
|
|
* @param jobName |
|
|
|
|
* @param jobGroup |
|
|
|
|
* @return |
|
|
|
|
* @throws SchedulerException |
|
|
|
|
*/ |
|
|
|
|
public static boolean pauseJob(String jobName, String jobGroup) throws SchedulerException { |
|
|
|
|
// TriggerKey : name + group
|
|
|
|
|
TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup); |
|
|
|
@ -273,7 +300,14 @@ public final class XxlJobDynamicScheduler implements ApplicationContextAware, In |
|
|
|
|
return result; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// resume
|
|
|
|
|
/** |
|
|
|
|
* resume |
|
|
|
|
* |
|
|
|
|
* @param jobName |
|
|
|
|
* @param jobGroup |
|
|
|
|
* @return |
|
|
|
|
* @throws SchedulerException |
|
|
|
|
*/ |
|
|
|
|
public static boolean resumeJob(String jobName, String jobGroup) throws SchedulerException { |
|
|
|
|
// TriggerKey : name + group
|
|
|
|
|
TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup); |
|
|
|
@ -289,7 +323,14 @@ public final class XxlJobDynamicScheduler implements ApplicationContextAware, In |
|
|
|
|
return result; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// run
|
|
|
|
|
/** |
|
|
|
|
* run |
|
|
|
|
* |
|
|
|
|
* @param jobName |
|
|
|
|
* @param jobGroup |
|
|
|
|
* @return |
|
|
|
|
* @throws SchedulerException |
|
|
|
|
*/ |
|
|
|
|
public static boolean triggerJob(String jobName, String jobGroup) throws SchedulerException { |
|
|
|
|
// TriggerKey : name + group
|
|
|
|
|
JobKey jobKey = new JobKey(jobName, jobGroup); |
|
|
|
@ -305,5 +346,41 @@ public final class XxlJobDynamicScheduler implements ApplicationContextAware, In |
|
|
|
|
return result; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* finaAllJobList |
|
|
|
|
* |
|
|
|
|
* @return |
|
|
|
|
*//*
|
|
|
|
|
@Deprecated |
|
|
|
|
public static List<Map<String, Object>> finaAllJobList(){ |
|
|
|
|
List<Map<String, Object>> jobList = new ArrayList<Map<String,Object>>(); |
|
|
|
|
|
|
|
|
|
try { |
|
|
|
|
if (scheduler.getJobGroupNames()==null || scheduler.getJobGroupNames().size()==0) { |
|
|
|
|
return null; |
|
|
|
|
} |
|
|
|
|
String groupName = scheduler.getJobGroupNames().get(0); |
|
|
|
|
Set<JobKey> jobKeys = scheduler.getJobKeys(GroupMatcher.jobGroupEquals(groupName)); |
|
|
|
|
if (jobKeys!=null && jobKeys.size()>0) { |
|
|
|
|
for (JobKey jobKey : jobKeys) { |
|
|
|
|
TriggerKey triggerKey = TriggerKey.triggerKey(jobKey.getName(), Scheduler.DEFAULT_GROUP); |
|
|
|
|
Trigger trigger = scheduler.getTrigger(triggerKey); |
|
|
|
|
JobDetail jobDetail = scheduler.getJobDetail(jobKey); |
|
|
|
|
TriggerState triggerState = scheduler.getTriggerState(triggerKey); |
|
|
|
|
Map<String, Object> jobMap = new HashMap<String, Object>(); |
|
|
|
|
jobMap.put("TriggerKey", triggerKey); |
|
|
|
|
jobMap.put("Trigger", trigger); |
|
|
|
|
jobMap.put("JobDetail", jobDetail); |
|
|
|
|
jobMap.put("TriggerState", triggerState); |
|
|
|
|
jobList.add(jobMap); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} catch (SchedulerException e) { |
|
|
|
|
e.printStackTrace(); |
|
|
|
|
return null; |
|
|
|
|
} |
|
|
|
|
return jobList; |
|
|
|
|
}*/ |
|
|
|
|
|
|
|
|
|
} |