From f2d914a99670b733b01f9529c26e1bd08dc8fd27 Mon Sep 17 00:00:00 2001 From: ShenHuaJie Date: Sun, 27 Nov 2016 14:50:48 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E5=8A=A8=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iBase4J-Biz-Web/pom.xml | 11 - iBase4J-Common/pom.xml | 12 + .../org/ibase4j/core/base/BaseMapper.java | 2 +- .../provider/scheduler/CoreTaskProvider.java | 2 +- .../provider/scheduler/SchedulerProvider.java | 5 +- .../core/support}/scheduler/Constants.java | 2 +- .../core/support/scheduler/job/DubboJob.java | 43 +++ .../core/support/scheduler/job/LocalJob.java | 40 +++ .../scheduler/manager/JobListener.java | 19 +- .../scheduler/manager/SchedulerManager.java | 5 +- .../manager/SchedulerManagerImpl.java | 335 +++++++++++++++++ .../scheduler/manager/TriggerLoader.java | 65 ++++ .../provider}/SchedulerProviderImpl.java | 18 +- .../scheduler}/service/SchedulerService.java | 15 +- .../dao/scheduler/TaskFireLogMapper.java | 2 +- .../dao/scheduler/TaskGroupMapper.java | 0 .../dao/scheduler/TaskSchedulerMapper.java | 0 .../ibase4j/model/scheduler/TaskFireLog.java | 0 .../ibase4j/model/scheduler/TaskGroup.java | 0 .../model/scheduler/TaskScheduler.java | 38 -- .../model/scheduler/ext/TaskScheduled.java | 0 .../scheduler/ext/TaskSchedulerBean.java | 0 .../main/resources/config/quartz.properties | 0 .../resources/mappers/TaskFireLogMapper.xml | 4 +- .../resources/mappers/TaskGroupMapper.xml | 2 +- .../resources/mappers/TaskSchedulerMapper.xml | 2 +- .../src/main/resources/spring/mq.xml | 7 + .../src/main/resources/spring/mybatis.xml | 2 +- .../src/main/resources/spring/scheduler.xml | 18 +- iBase4J-SYS-Service/pom.xml | 6 + ...Service.java => CoreTaskProviderImpl.java} | 7 +- .../src/main/resources/Spring-config.xml | 1 + iBase4J-Scheduler-API/pom.xml | 28 -- iBase4J-Scheduler-Service/pom.xml | 92 ----- .../manager/DefaultSchedulerManager.java | 339 ------------------ .../scheduler/manager/TriggerLoader.java | 66 ---- .../org/ibase4j/scheduler/task/DubboTask.java | 38 -- .../src/main/resources/Spring-config.xml | 35 -- .../src/main/resources/config/jdbc.properties | 29 -- .../src/main/resources/log4j2.xml | 73 ---- .../src/main/resources/spring/mq-listener.xml | 18 - .../src/main/webapp/META-INF/context.xml | 2 - .../src/main/webapp/WEB-INF/web.xml | 47 --- iBase4J-Web/pom.xml | 11 - .../service/scheduler/SchedulerService.java | 8 +- .../web/scheduler/ScheduledController.java | 100 +++--- iBase4J.sql | 8 +- pom-biz-web-server.xml | 1 - pom-scheduler-server.xml | 21 -- pom-web-server.xml | 1 - pom.xml | 4 +- 51 files changed, 632 insertions(+), 952 deletions(-) rename iBase4J-Common/src/main/java/org/ibase4j/{ => core}/provider/scheduler/CoreTaskProvider.java (59%) rename {iBase4J-Scheduler-API/src/main/java/org/ibase4j => iBase4J-Common/src/main/java/org/ibase4j/core}/provider/scheduler/SchedulerProvider.java (87%) rename {iBase4J-Scheduler-Service/src/main/java/org/ibase4j => iBase4J-Common/src/main/java/org/ibase4j/core/support}/scheduler/Constants.java (86%) create mode 100644 iBase4J-Common/src/main/java/org/ibase4j/core/support/scheduler/job/DubboJob.java create mode 100644 iBase4J-Common/src/main/java/org/ibase4j/core/support/scheduler/job/LocalJob.java rename iBase4J-Scheduler-Service/src/main/java/org/ibase4j/scheduler/manager/TaskListener.java => iBase4J-Common/src/main/java/org/ibase4j/core/support/scheduler/manager/JobListener.java (81%) rename {iBase4J-Scheduler-Service/src/main/java/org/ibase4j => iBase4J-Common/src/main/java/org/ibase4j/core/support}/scheduler/manager/SchedulerManager.java (85%) create mode 100644 iBase4J-Common/src/main/java/org/ibase4j/core/support/scheduler/manager/SchedulerManagerImpl.java create mode 100644 iBase4J-Common/src/main/java/org/ibase4j/core/support/scheduler/manager/TriggerLoader.java rename {iBase4J-Scheduler-Service/src/main/java/org/ibase4j/provider/scheduler => iBase4J-Common/src/main/java/org/ibase4j/core/support/scheduler/provider}/SchedulerProviderImpl.java (68%) rename {iBase4J-Scheduler-Service/src/main/java/org/ibase4j => iBase4J-Common/src/main/java/org/ibase4j/core/support/scheduler}/service/SchedulerService.java (89%) rename {iBase4J-Scheduler-Service => iBase4J-Common}/src/main/java/org/ibase4j/dao/scheduler/TaskFireLogMapper.java (94%) rename {iBase4J-Scheduler-Service => iBase4J-Common}/src/main/java/org/ibase4j/dao/scheduler/TaskGroupMapper.java (100%) rename {iBase4J-Scheduler-Service => iBase4J-Common}/src/main/java/org/ibase4j/dao/scheduler/TaskSchedulerMapper.java (100%) rename {iBase4J-Scheduler-API => iBase4J-Common}/src/main/java/org/ibase4j/model/scheduler/TaskFireLog.java (100%) rename {iBase4J-Scheduler-API => iBase4J-Common}/src/main/java/org/ibase4j/model/scheduler/TaskGroup.java (100%) rename {iBase4J-Scheduler-API => iBase4J-Common}/src/main/java/org/ibase4j/model/scheduler/TaskScheduler.java (78%) rename {iBase4J-Scheduler-API => iBase4J-Common}/src/main/java/org/ibase4j/model/scheduler/ext/TaskScheduled.java (100%) rename {iBase4J-Scheduler-API => iBase4J-Common}/src/main/java/org/ibase4j/model/scheduler/ext/TaskSchedulerBean.java (100%) rename {iBase4J-Scheduler-Service => iBase4J-Common}/src/main/resources/config/quartz.properties (100%) rename {iBase4J-Scheduler-Service => iBase4J-Common}/src/main/resources/mappers/TaskFireLogMapper.xml (96%) rename {iBase4J-Scheduler-Service => iBase4J-Common}/src/main/resources/mappers/TaskGroupMapper.xml (96%) rename {iBase4J-Scheduler-Service => iBase4J-Common}/src/main/resources/mappers/TaskSchedulerMapper.xml (96%) rename {iBase4J-Scheduler-Service => iBase4J-Common}/src/main/resources/spring/scheduler.xml (53%) rename iBase4J-SYS-Service/src/main/java/org/ibase4j/provider/scheduler/{CoreTaskService.java => CoreTaskProviderImpl.java} (75%) delete mode 100644 iBase4J-Scheduler-API/pom.xml delete mode 100644 iBase4J-Scheduler-Service/pom.xml delete mode 100644 iBase4J-Scheduler-Service/src/main/java/org/ibase4j/scheduler/manager/DefaultSchedulerManager.java delete mode 100644 iBase4J-Scheduler-Service/src/main/java/org/ibase4j/scheduler/manager/TriggerLoader.java delete mode 100644 iBase4J-Scheduler-Service/src/main/java/org/ibase4j/scheduler/task/DubboTask.java delete mode 100644 iBase4J-Scheduler-Service/src/main/resources/Spring-config.xml delete mode 100644 iBase4J-Scheduler-Service/src/main/resources/config/jdbc.properties delete mode 100644 iBase4J-Scheduler-Service/src/main/resources/log4j2.xml delete mode 100644 iBase4J-Scheduler-Service/src/main/resources/spring/mq-listener.xml delete mode 100644 iBase4J-Scheduler-Service/src/main/webapp/META-INF/context.xml delete mode 100644 iBase4J-Scheduler-Service/src/main/webapp/WEB-INF/web.xml delete mode 100644 pom-scheduler-server.xml diff --git a/iBase4J-Biz-Web/pom.xml b/iBase4J-Biz-Web/pom.xml index 5681c5da..7509e6bb 100644 --- a/iBase4J-Biz-Web/pom.xml +++ b/iBase4J-Biz-Web/pom.xml @@ -25,17 +25,6 @@ - - org.ibase4j - iBase4J-Scheduler-API - ${project.version} - - - * - * - - - org.ibase4j iBase4J-SYS-API diff --git a/iBase4J-Common/pom.xml b/iBase4J-Common/pom.xml index 72aa92a6..e2284770 100644 --- a/iBase4J-Common/pom.xml +++ b/iBase4J-Common/pom.xml @@ -13,11 +13,23 @@ + + + mysql + mysql-connector-java + ${mysql.version} + com.alibaba druid ${druid.version} + + + org.quartz-scheduler + quartz + ${quartz.version} + org.mybatis diff --git a/iBase4J-Common/src/main/java/org/ibase4j/core/base/BaseMapper.java b/iBase4J-Common/src/main/java/org/ibase4j/core/base/BaseMapper.java index f7be1f97..061d1f01 100644 --- a/iBase4J-Common/src/main/java/org/ibase4j/core/base/BaseMapper.java +++ b/iBase4J-Common/src/main/java/org/ibase4j/core/base/BaseMapper.java @@ -16,7 +16,7 @@ import org.apache.ibatis.session.RowBounds; * @version 2016年6月3日 下午2:30:14 */ -public interface BaseMapper extends com.baomidou.mybatisplus.mapper.BaseMapper { +public interface BaseMapper extends com.baomidou.mybatisplus.mapper.BaseMapper { List selectIdByMap(RowBounds rowBounds, @Param("cm") Map params); } diff --git a/iBase4J-Common/src/main/java/org/ibase4j/provider/scheduler/CoreTaskProvider.java b/iBase4J-Common/src/main/java/org/ibase4j/core/provider/scheduler/CoreTaskProvider.java similarity index 59% rename from iBase4J-Common/src/main/java/org/ibase4j/provider/scheduler/CoreTaskProvider.java rename to iBase4J-Common/src/main/java/org/ibase4j/core/provider/scheduler/CoreTaskProvider.java index 20112afd..e1a7f442 100644 --- a/iBase4J-Common/src/main/java/org/ibase4j/provider/scheduler/CoreTaskProvider.java +++ b/iBase4J-Common/src/main/java/org/ibase4j/core/provider/scheduler/CoreTaskProvider.java @@ -1,4 +1,4 @@ -package org.ibase4j.provider.scheduler; +package org.ibase4j.core.provider.scheduler; public interface CoreTaskProvider { void cleanExpiredSessions(); diff --git a/iBase4J-Scheduler-API/src/main/java/org/ibase4j/provider/scheduler/SchedulerProvider.java b/iBase4J-Common/src/main/java/org/ibase4j/core/provider/scheduler/SchedulerProvider.java similarity index 87% rename from iBase4J-Scheduler-API/src/main/java/org/ibase4j/provider/scheduler/SchedulerProvider.java rename to iBase4J-Common/src/main/java/org/ibase4j/core/provider/scheduler/SchedulerProvider.java index e23f059f..f60e8ba0 100644 --- a/iBase4J-Scheduler-API/src/main/java/org/ibase4j/provider/scheduler/SchedulerProvider.java +++ b/iBase4J-Common/src/main/java/org/ibase4j/core/provider/scheduler/SchedulerProvider.java @@ -1,7 +1,7 @@ /** * */ -package org.ibase4j.provider.scheduler; +package org.ibase4j.core.provider.scheduler; import java.util.List; import java.util.Map; @@ -30,6 +30,9 @@ public interface SchedulerProvider { /** 启停 */ public boolean openCloseTask(String taskGroup, String taskName, String status); + + /** 删除作业 */ + public boolean delTask(String taskGroup, String taskName); public TaskGroup getGroupById(String id); diff --git a/iBase4J-Scheduler-Service/src/main/java/org/ibase4j/scheduler/Constants.java b/iBase4J-Common/src/main/java/org/ibase4j/core/support/scheduler/Constants.java similarity index 86% rename from iBase4J-Scheduler-Service/src/main/java/org/ibase4j/scheduler/Constants.java rename to iBase4J-Common/src/main/java/org/ibase4j/core/support/scheduler/Constants.java index e2701528..68979a4b 100644 --- a/iBase4J-Scheduler-Service/src/main/java/org/ibase4j/scheduler/Constants.java +++ b/iBase4J-Common/src/main/java/org/ibase4j/core/support/scheduler/Constants.java @@ -1,4 +1,4 @@ -package org.ibase4j.scheduler; +package org.ibase4j.core.support.scheduler; public class Constants { /** diff --git a/iBase4J-Common/src/main/java/org/ibase4j/core/support/scheduler/job/DubboJob.java b/iBase4J-Common/src/main/java/org/ibase4j/core/support/scheduler/job/DubboJob.java new file mode 100644 index 00000000..c065f10d --- /dev/null +++ b/iBase4J-Common/src/main/java/org/ibase4j/core/support/scheduler/job/DubboJob.java @@ -0,0 +1,43 @@ +package org.ibase4j.core.support.scheduler.job; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.ibase4j.core.support.dubbo.ReferenceUtil; +import org.ibase4j.core.support.scheduler.Constants; +import org.quartz.Job; +import org.quartz.JobDataMap; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.quartz.JobKey; +import org.springframework.context.ApplicationContext; + +/** + * Dubbo调用远程作业 + * + * @author ShenHuaJie + * @version 2016年5月27日 下午4:30:46 + */ +public class DubboJob implements Job { + private Logger logger = LogManager.getLogger(this.getClass()); + // 作业接口包名 + private String provider = "org.ibase4j.provider.scheduler."; + + public void execute(JobExecutionContext context) throws JobExecutionException { + long start = System.currentTimeMillis(); + JobDataMap jobDataMap = context.getJobDetail().getJobDataMap(); + if (Constants.ERROR_STATS.equals(jobDataMap.get("taskStatus"))) { + return; + } + ApplicationContext applicationContext = null; + JobKey jobKey = context.getJobDetail().getKey(); + try { + applicationContext = (ApplicationContext)context.getScheduler().getContext().get("applicationContext"); + Object refer = ReferenceUtil.refer(applicationContext, provider + jobKey.getGroup()); + refer.getClass().getDeclaredMethod(jobKey.getName()).invoke(refer); + double time = (System.currentTimeMillis() - start) / 1000.0; + logger.info("用时:{}s", time); + } catch (Exception e) { + throw new JobExecutionException(e); + } + } +} diff --git a/iBase4J-Common/src/main/java/org/ibase4j/core/support/scheduler/job/LocalJob.java b/iBase4J-Common/src/main/java/org/ibase4j/core/support/scheduler/job/LocalJob.java new file mode 100644 index 00000000..48c64cc3 --- /dev/null +++ b/iBase4J-Common/src/main/java/org/ibase4j/core/support/scheduler/job/LocalJob.java @@ -0,0 +1,40 @@ +package org.ibase4j.core.support.scheduler.job; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.ibase4j.core.support.scheduler.Constants; +import org.quartz.Job; +import org.quartz.JobDataMap; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.quartz.JobKey; +import org.springframework.context.ApplicationContext; + +/** + * 本地调用远程作业 + * + * @author ShenHuaJie + * @version 2016年5月27日 下午4:30:46 + */ +public class LocalJob implements Job { + private Logger logger = LogManager.getLogger(this.getClass()); + + public void execute(JobExecutionContext context) throws JobExecutionException { + long start = System.currentTimeMillis(); + JobDataMap jobDataMap = context.getJobDetail().getJobDataMap(); + if (Constants.ERROR_STATS.equals(jobDataMap.get("taskStatus"))) { + return; + } + JobKey jobKey = context.getJobDetail().getKey(); + try { + ApplicationContext applicationContext = (ApplicationContext)context.getScheduler().getContext() + .get("applicationContext"); + Object refer = applicationContext.getBean(jobKey.getGroup()); + refer.getClass().getDeclaredMethod(jobKey.getName()).invoke(refer); + double time = (System.currentTimeMillis() - start) / 1000.0; + logger.info("用时:{}s", time); + } catch (Exception e) { + throw new JobExecutionException(e); + } + } +} diff --git a/iBase4J-Scheduler-Service/src/main/java/org/ibase4j/scheduler/manager/TaskListener.java b/iBase4J-Common/src/main/java/org/ibase4j/core/support/scheduler/manager/JobListener.java similarity index 81% rename from iBase4J-Scheduler-Service/src/main/java/org/ibase4j/scheduler/manager/TaskListener.java rename to iBase4J-Common/src/main/java/org/ibase4j/core/support/scheduler/manager/JobListener.java index 8059867b..59c50923 100644 --- a/iBase4J-Scheduler-Service/src/main/java/org/ibase4j/scheduler/manager/TaskListener.java +++ b/iBase4J-Common/src/main/java/org/ibase4j/core/support/scheduler/manager/JobListener.java @@ -1,4 +1,4 @@ -package org.ibase4j.scheduler.manager; +package org.ibase4j.core.support.scheduler.manager; import java.sql.Timestamp; import java.util.concurrent.ExecutorService; @@ -9,16 +9,14 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.ibase4j.core.support.email.Email; import org.ibase4j.core.support.mq.QueueSender; +import org.ibase4j.core.support.scheduler.Constants; +import org.ibase4j.core.support.scheduler.service.SchedulerService; import org.ibase4j.core.util.NativeUtil; import org.ibase4j.model.scheduler.TaskFireLog; -import org.ibase4j.model.scheduler.TaskScheduler; -import org.ibase4j.scheduler.Constants; -import org.ibase4j.service.SchedulerService; import org.quartz.JobDataMap; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.quartz.JobKey; -import org.quartz.JobListener; import org.springframework.beans.factory.annotation.Autowired; import com.alibaba.fastjson.JSON; @@ -29,7 +27,7 @@ import com.alibaba.fastjson.JSON; * @author ShenHuaJie * @version 2016年5月27日 下午4:31:31 */ -public class TaskListener implements JobListener { +public class JobListener implements org.quartz.JobListener { private Logger logger = LogManager.getLogger(this.getClass()); @Autowired private SchedulerService schedulerService; @@ -53,7 +51,7 @@ public class TaskListener implements JobListener { String groupName = jobKey.getGroup(); String jobName = jobKey.getName(); if (logger.isInfoEnabled()) { - logger.info("Listened job : " + groupName + "." + jobName + " prepared to start."); + logger.info("定时任务开始执行:{}.{}", groupName, jobName); } if ("cleanExpiredSessions".equals(jobName)) { return; @@ -80,7 +78,7 @@ public class TaskListener implements JobListener { String groupName = context.getJobDetail().getKey().getGroup(); String jobName = context.getJobDetail().getKey().getName(); if (logger.isInfoEnabled()) { - logger.info("Listened job : " + groupName + "." + jobName + " executed."); + logger.info("定时任务执行结束:{}.{}", groupName, jobName); } // 更新任务执行状态 final TaskFireLog log = (TaskFireLog)jobDataMap.get(Constants.JOB_LOG); @@ -109,11 +107,6 @@ public class TaskListener implements JobListener { logger.error("Update TaskRunLog cause error. The log object is : " + JSON.toJSONString(log), e); } } - // 更新任务执行时间 - TaskScheduler taskScheduler = schedulerService.getSchedulerById(jobDataMap.getString("id")); - taskScheduler.setTaskPreviousFireTime(context.getFireTime()); - taskScheduler.setTaskNextFireTime(context.getNextFireTime()); - schedulerService.updateScheduler(taskScheduler); } }); } diff --git a/iBase4J-Scheduler-Service/src/main/java/org/ibase4j/scheduler/manager/SchedulerManager.java b/iBase4J-Common/src/main/java/org/ibase4j/core/support/scheduler/manager/SchedulerManager.java similarity index 85% rename from iBase4J-Scheduler-Service/src/main/java/org/ibase4j/scheduler/manager/SchedulerManager.java rename to iBase4J-Common/src/main/java/org/ibase4j/core/support/scheduler/manager/SchedulerManager.java index b068d5e7..8bd52fe0 100644 --- a/iBase4J-Scheduler-Service/src/main/java/org/ibase4j/scheduler/manager/SchedulerManager.java +++ b/iBase4J-Common/src/main/java/org/ibase4j/core/support/scheduler/manager/SchedulerManager.java @@ -1,4 +1,4 @@ -package org.ibase4j.scheduler.manager; +package org.ibase4j.core.support.scheduler.manager; import java.util.List; @@ -29,6 +29,9 @@ public interface SchedulerManager { /** 运行任务 */ public boolean runJob(TaskScheduled scheduleJob); + + /** 删除任务 */ + public boolean delJob(TaskScheduled scheduleJob); /** 刷新调度(新增任务为暂停状态) */ public boolean refreshScheduler(); diff --git a/iBase4J-Common/src/main/java/org/ibase4j/core/support/scheduler/manager/SchedulerManagerImpl.java b/iBase4J-Common/src/main/java/org/ibase4j/core/support/scheduler/manager/SchedulerManagerImpl.java new file mode 100644 index 00000000..dc75aeeb --- /dev/null +++ b/iBase4J-Common/src/main/java/org/ibase4j/core/support/scheduler/manager/SchedulerManagerImpl.java @@ -0,0 +1,335 @@ +package org.ibase4j.core.support.scheduler.manager; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.ibase4j.core.util.InstanceUtil; +import org.ibase4j.model.scheduler.ext.TaskScheduled; +import org.quartz.CronTrigger; +import org.quartz.JobDetail; +import org.quartz.JobExecutionContext; +import org.quartz.JobKey; +import org.quartz.JobListener; +import org.quartz.Scheduler; +import org.quartz.SchedulerException; +import org.quartz.Trigger; +import org.quartz.impl.matchers.GroupMatcher; +import org.springframework.beans.factory.InitializingBean; + +/** + * 默认的定时任务管理器 + * + * @author ShenHuaJie + * @version 2016年5月27日 上午10:28:26 + */ +public class SchedulerManagerImpl implements SchedulerManager, InitializingBean { + private Logger logger = LogManager.getLogger(this.getClass()); + + private Scheduler scheduler; + + private List triggerLoaders; + + private List jobListeners; + + public void setScheduler(Scheduler scheduler) { + this.scheduler = scheduler; + } + + public void setTriggerLoaders(List triggerLoaders) { + this.triggerLoaders = triggerLoaders; + } + + public void setJobListeners(List jobListeners) { + this.jobListeners = jobListeners; + } + + // 调度初始化入口 + public void afterPropertiesSet() throws Exception { + if (this.jobListeners != null && this.jobListeners.size() > 0) { + if (logger.isInfoEnabled()) { + logger.info("Initing task scheduler[" + this.scheduler.getSchedulerName() + "] , add listener size :" + + this.jobListeners.size()); + } + for (JobListener listener : this.jobListeners) { + if (logger.isInfoEnabled()) { + logger.info("Add JobListener : " + listener.getName()); + } + this.scheduler.getListenerManager().addJobListener(listener); + } + } + + // 根据配置的初始化装载 + if (this.triggerLoaders != null && this.triggerLoaders.size() > 0) { + if (logger.isInfoEnabled()) { + logger.info("Initing task scheduler[" + this.scheduler.getSchedulerName() + "] , trigger loaders size :" + + this.triggerLoaders.size()); + } + for (TriggerLoader loader : this.triggerLoaders) { + if (logger.isInfoEnabled()) { + logger.info("Initing triggerLoader[" + loader.getClass().getName() + "]."); + } + Map loadResultMap = loader.loadTriggers(); + if (loadResultMap != null) { + for (Entry entry : loadResultMap.entrySet()) { + JobDetail oldJobDetail = null; + try { + oldJobDetail = this.scheduler.getJobDetail(entry.getValue().getKey()); + } catch (Exception e) { + } + if (oldJobDetail == null) { + scheduler.scheduleJob(entry.getValue(), entry.getKey()); + } else { + this.addJobDetail(entry.getValue()); + this.updateTrigger(entry.getKey()); + } + } + if (logger.isInfoEnabled()) { + logger.info("Initing triggerLoader[" + loader.getClass().getName() + "] end ."); + } + } else { + logger.warn("No triggers loaded by triggerLoader[" + loader.getClass().getName() + "]."); + } + } + } else { + logger.warn("No TriggerLoader for initing."); + } + } + + private void addTrigger(Trigger trigger) { + Trigger oldTrigger = null; + try { + oldTrigger = scheduler.getTrigger(trigger.getKey()); + } catch (Exception e) { + } + try { + if (oldTrigger == null) { + if (logger.isInfoEnabled()) { + logger.info("Try to add trigger : " + trigger); + } + scheduler.scheduleJob(trigger); + if (!trigger.getJobDataMap().getBoolean("enable")) { + scheduler.pauseTrigger(trigger.getKey()); + } + } else { + updateTrigger(trigger); + } + } catch (SchedulerException e) { + logger.error("Try to add trigger : " + trigger + " cause error : ", e); + } + } + + private void updateTrigger(Trigger trigger) { + Trigger oldTrigger = null; + try { + oldTrigger = scheduler.getTrigger(trigger.getKey()); + } catch (Exception e) { + } + try { + if (oldTrigger != null) { + if (logger.isInfoEnabled()) { + logger.info("Try to update trigger : " + trigger); + } + scheduler.rescheduleJob(trigger.getKey(), trigger); + if (!trigger.getJobDataMap().getBoolean("enable")) { + scheduler.pauseTrigger(trigger.getKey()); + } + } else { + logger.warn("Can't update trigger : " + trigger); + } + } catch (SchedulerException e) { + logger.error("Try to update trigger : " + trigger + ", the old trigger is : " + + (oldTrigger == null ? "null" : oldTrigger.toString()) + " cause error : ", e); + } + } + + private void addJobDetail(JobDetail jobDetail) { + JobDetail oldJobDetail = null; + try { + oldJobDetail = this.scheduler.getJobDetail(jobDetail.getKey()); + } catch (Exception e) { + } + try { + if (logger.isInfoEnabled()) { + logger.info("Try to add jobDetail : " + jobDetail); + } + this.scheduler.addJob(jobDetail, true); + } catch (Exception e) { + logger.error("Try to add jobDetail : " + jobDetail + ", the old jobDetail is : " + + (oldJobDetail == null ? "null" : oldJobDetail.toString()) + " cause error : ", e); + } + } + + public List getAllJobDetail() { + List result = new LinkedList(); + try { + GroupMatcher matcher = GroupMatcher.jobGroupContains(""); + Set jobKeys = scheduler.getJobKeys(matcher); + for (JobKey jobKey : jobKeys) { + List triggers = scheduler.getTriggersOfJob(jobKey); + for (Trigger trigger : triggers) { + TaskScheduled job = new TaskScheduled(); + job.setTaskName(jobKey.getName()); + job.setTaskGroup(jobKey.getGroup()); + Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey()); + job.setStatus(triggerState.name()); + if (trigger instanceof CronTrigger) { + CronTrigger cronTrigger = (CronTrigger)trigger; + String cronExpression = cronTrigger.getCronExpression(); + job.setTaskCron(cronExpression); + } + job.setPreviousFireTime(trigger.getPreviousFireTime()); + job.setNextFireTime(trigger.getNextFireTime()); + job.setDesc(trigger.getJobDataMap().getString("desc")); + result.add(job); + } + } + } catch (Exception e) { + logger.error("Try to load All JobDetail cause error : ", e); + } + return result; + } + + public JobDetail getJobDetailByTriggerName(Trigger trigger) { + try { + return this.scheduler.getJobDetail(trigger.getJobKey()); + } catch (Exception e) { + logger.error(e.getMessage(), e); + } + return null; + } + + // 获取运行中任务 + public List getRuningJobDetail() { + List jobList = null; + try { + List executingJobs = scheduler.getCurrentlyExecutingJobs(); + jobList = new ArrayList(executingJobs.size()); + for (JobExecutionContext executingJob : executingJobs) { + TaskScheduled job = new TaskScheduled(); + JobDetail jobDetail = executingJob.getJobDetail(); + JobKey jobKey = jobDetail.getKey(); + Trigger trigger = executingJob.getTrigger(); + job.setTaskName(jobKey.getName()); + job.setTaskGroup(jobKey.getGroup()); + Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey()); + job.setStatus(triggerState.name()); + if (trigger instanceof CronTrigger) { + CronTrigger cronTrigger = (CronTrigger)trigger; + String cronExpression = cronTrigger.getCronExpression(); + job.setTaskCron(cronExpression); + } + job.setPreviousFireTime(trigger.getPreviousFireTime()); + job.setNextFireTime(trigger.getNextFireTime()); + job.setDesc(trigger.getJobDataMap().getString("desc")); + jobList.add(job); + } + } catch (Exception e) { + logger.error("Try to load running JobDetail cause error : ", e); + } + return jobList; + } + + // 暂停任务 + public boolean stopJob(TaskScheduled scheduleJob) { + try { + JobKey jobKey = JobKey.jobKey(scheduleJob.getTaskName(), scheduleJob.getTaskGroup()); + scheduler.pauseJob(jobKey); + return true; + } catch (Exception e) { + logger.error("Try to stop Job cause error : ", e); + } + return false; + } + + // 启动任务 + public boolean resumeJob(TaskScheduled scheduleJob) { + try { + JobKey jobKey = JobKey.jobKey(scheduleJob.getTaskName(), scheduleJob.getTaskGroup()); + scheduler.resumeJob(jobKey); + return true; + } catch (Exception e) { + logger.error("Try to resume Job cause error : ", e); + } + return false; + } + + // 执行任务 + public boolean runJob(TaskScheduled scheduleJob) { + try { + JobKey jobKey = JobKey.jobKey(scheduleJob.getTaskName(), scheduleJob.getTaskGroup()); + scheduler.triggerJob(jobKey); + return true; + } catch (Exception e) { + logger.error("Try to resume Job cause error : ", e); + } + return false; + } + + // 删除任务 + public boolean delJob(TaskScheduled scheduleJob) { + try { + JobKey jobKey = JobKey.jobKey(scheduleJob.getTaskName(), scheduleJob.getTaskGroup()); + scheduler.deleteJob(jobKey); + return true; + } catch (Exception e) { + logger.error("Try to resume Job cause error : ", e); + } + return false; + } + + public boolean refreshScheduler() { + try { + // 根据配置的初始化装载 + if (this.triggerLoaders != null && this.triggerLoaders.size() > 0) { + if (logger.isInfoEnabled()) { + logger.info("Initing task scheduler[" + this.scheduler.getSchedulerName() + + "] , trigger loaders size :" + this.triggerLoaders.size()); + } + // 获取原始调度状态 + List scheduleJobs = getAllJobDetail(); + Map stateMap = InstanceUtil.newHashMap(); + for (TaskScheduled scheduleJob : scheduleJobs) { + stateMap.put(scheduleJob.getTaskGroup() + "." + scheduleJob.getTaskName(), scheduleJob.getStatus()); + } + // 清空调度 + scheduler.clear(); + // 加载调度 + for (TriggerLoader loader : this.triggerLoaders) { + if (logger.isInfoEnabled()) { + logger.info("Initing triggerLoader[" + loader.getClass().getName() + "]."); + } + Map loadResultMap = loader.loadTriggers(); + if (loadResultMap != null) { + for (Entry entry : loadResultMap.entrySet()) { + this.addJobDetail(entry.getValue()); + this.addTrigger(entry.getKey()); + JobKey jobKey = entry.getValue().getKey(); + String key = jobKey.getGroup() + "." + jobKey.getName(); + // 新增任务或原来为暂停状态 + if ("PAUSED".equals(stateMap.get(key)) || !stateMap.containsKey(key)) { + scheduler.pauseJob(jobKey); + } + } + if (logger.isInfoEnabled()) { + logger.info("Initing triggerLoader[" + loader.getClass().getName() + "] end ."); + } + } else { + logger.warn("No triggers loaded by triggerLoader[" + loader.getClass().getName() + "]."); + } + } + } else { + logger.warn("No TriggerLoader for initing."); + } + return true; + } catch (Exception e) { + logger.error("Try to refresh scheduler cause error : ", e); + } + return false; + } +} diff --git a/iBase4J-Common/src/main/java/org/ibase4j/core/support/scheduler/manager/TriggerLoader.java b/iBase4J-Common/src/main/java/org/ibase4j/core/support/scheduler/manager/TriggerLoader.java new file mode 100644 index 00000000..1036e982 --- /dev/null +++ b/iBase4J-Common/src/main/java/org/ibase4j/core/support/scheduler/manager/TriggerLoader.java @@ -0,0 +1,65 @@ +package org.ibase4j.core.support.scheduler.manager; + +import java.util.List; +import java.util.Map; + +import org.ibase4j.core.provider.scheduler.SchedulerProvider; +import org.ibase4j.core.util.InstanceUtil; +import org.ibase4j.dao.scheduler.TaskSchedulerMapper; +import org.ibase4j.model.scheduler.TaskGroup; +import org.ibase4j.model.scheduler.TaskScheduler; +import org.quartz.CronScheduleBuilder; +import org.quartz.Job; +import org.quartz.JobBuilder; +import org.quartz.JobDataMap; +import org.quartz.JobDetail; +import org.quartz.Trigger; +import org.quartz.TriggerBuilder; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 作业加载器 + * + * @author ShenHueJie + * @version 2016年5月27日 下午4:31:52 + */ +public class TriggerLoader { + @Autowired + private SchedulerProvider schedulerProvider; + @Autowired + private TaskSchedulerMapper taskSchedulerMapper; + // 执行作业的类 + private Class jobClass; + + public TriggerLoader(Class jobClass) { + this.jobClass = jobClass; + } + + public Map loadTriggers() { + Map params = InstanceUtil.newHashMap(); + String taskType = jobClass.getSimpleName().replace("Job", "").toLowerCase(); // 作业类型 + params.put("taskType", taskType); + List taskSchedulerIds = taskSchedulerMapper.selectIdByMap(params); + Map resultMap = InstanceUtil.newHashMap(); + for (String id : taskSchedulerIds) { + TaskScheduler taskScheduler = schedulerProvider.getSchedulerById(id); + TaskGroup taskGroup = schedulerProvider.getGroupById(taskScheduler.getGroupId()); + JobDataMap jobDataMap = new JobDataMap(); + jobDataMap.put("id", taskScheduler.getId()); + jobDataMap.put("enable", taskScheduler.getEnable()); + jobDataMap.put("contactEmail", taskScheduler.getContactEmail()); + jobDataMap.put("desc", taskGroup.getGroupDesc() + ":" + taskScheduler.getTaskDesc()); + JobDetail jobDetail = JobBuilder.newJob(jobClass) + .withIdentity(taskScheduler.getTaskName(), taskGroup.getGroupName()) + .withDescription(taskScheduler.getTaskDesc()).storeDurably(true).usingJobData(jobDataMap).build(); + + Trigger trigger = TriggerBuilder.newTrigger() + .withSchedule(CronScheduleBuilder.cronSchedule(taskScheduler.getTaskCron())) + .withIdentity(taskScheduler.getTaskName(), taskGroup.getGroupName()) + .withDescription(taskGroup.getGroupDesc()).forJob(jobDetail).usingJobData(jobDataMap).build(); + + resultMap.put(trigger, jobDetail); + } + return resultMap; + } +} diff --git a/iBase4J-Scheduler-Service/src/main/java/org/ibase4j/provider/scheduler/SchedulerProviderImpl.java b/iBase4J-Common/src/main/java/org/ibase4j/core/support/scheduler/provider/SchedulerProviderImpl.java similarity index 68% rename from iBase4J-Scheduler-Service/src/main/java/org/ibase4j/provider/scheduler/SchedulerProviderImpl.java rename to iBase4J-Common/src/main/java/org/ibase4j/core/support/scheduler/provider/SchedulerProviderImpl.java index e6e1e1fa..61672136 100644 --- a/iBase4J-Scheduler-Service/src/main/java/org/ibase4j/provider/scheduler/SchedulerProviderImpl.java +++ b/iBase4J-Common/src/main/java/org/ibase4j/core/support/scheduler/provider/SchedulerProviderImpl.java @@ -1,12 +1,11 @@ -package org.ibase4j.provider.scheduler; +package org.ibase4j.core.support.scheduler.provider; import java.util.List; -import org.ibase4j.core.support.dubbo.spring.annotation.DubboService; +import org.ibase4j.core.provider.scheduler.SchedulerProvider; +import org.ibase4j.core.support.scheduler.manager.SchedulerManager; +import org.ibase4j.core.support.scheduler.service.SchedulerService; import org.ibase4j.model.scheduler.ext.TaskScheduled; -import org.ibase4j.provider.scheduler.SchedulerProvider; -import org.ibase4j.scheduler.manager.SchedulerManager; -import org.ibase4j.service.SchedulerService; import org.springframework.beans.factory.annotation.Autowired; /** @@ -15,7 +14,6 @@ import org.springframework.beans.factory.annotation.Autowired; * @author ShenHuaJie * @version 2016年5月20日 下午3:19:59 */ -@DubboService(interfaceClass = SchedulerProvider.class) public class SchedulerProviderImpl extends SchedulerService implements SchedulerProvider { @Autowired private SchedulerManager schedulerManager; @@ -45,4 +43,12 @@ public class SchedulerProviderImpl extends SchedulerService implements Scheduler } return false; } + + // 删除作业 + public boolean delTask(String taskGroup, String taskName) { + TaskScheduled taskScheduler = new TaskScheduled(); + taskScheduler.setTaskGroup(taskGroup); + taskScheduler.setTaskName(taskName); + return schedulerManager.delJob(taskScheduler); + } } diff --git a/iBase4J-Scheduler-Service/src/main/java/org/ibase4j/service/SchedulerService.java b/iBase4J-Common/src/main/java/org/ibase4j/core/support/scheduler/service/SchedulerService.java similarity index 89% rename from iBase4J-Scheduler-Service/src/main/java/org/ibase4j/service/SchedulerService.java rename to iBase4J-Common/src/main/java/org/ibase4j/core/support/scheduler/service/SchedulerService.java index 7da84333..44b52166 100644 --- a/iBase4J-Scheduler-Service/src/main/java/org/ibase4j/service/SchedulerService.java +++ b/iBase4J-Common/src/main/java/org/ibase4j/core/support/scheduler/service/SchedulerService.java @@ -1,4 +1,4 @@ -package org.ibase4j.service; +package org.ibase4j.core.support.scheduler.service; import java.util.Date; import java.util.List; @@ -8,7 +8,6 @@ import org.apache.commons.lang3.StringUtils; import org.ibase4j.core.base.BaseProviderImpl; import org.ibase4j.core.util.InstanceUtil; import org.ibase4j.dao.scheduler.TaskFireLogMapper; -import org.ibase4j.dao.scheduler.TaskGroupMapper; import org.ibase4j.dao.scheduler.TaskSchedulerMapper; import org.ibase4j.model.scheduler.TaskFireLog; import org.ibase4j.model.scheduler.TaskGroup; @@ -17,7 +16,6 @@ import org.ibase4j.model.scheduler.ext.TaskSchedulerBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CachePut; import org.springframework.cache.annotation.Cacheable; -import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.baomidou.mybatisplus.plugins.Page; @@ -26,10 +24,7 @@ import com.baomidou.mybatisplus.plugins.Page; * @author ShenHuaJie * @version 2016年7月1日 上午11:34:59 */ -@Service public class SchedulerService extends BaseProviderImpl { - @Autowired - private TaskGroupMapper taskGroupMapper; @Autowired private TaskSchedulerMapper taskSchedulerMapper; @Autowired @@ -37,7 +32,7 @@ public class SchedulerService extends BaseProviderImpl { @Cacheable("taskGroup") public TaskGroup getGroupById(String id) { - return taskGroupMapper.selectById(id); + return mapper.selectById(id); } @Cacheable("taskScheduler") @@ -57,10 +52,10 @@ public class SchedulerService extends BaseProviderImpl { if (StringUtils.isBlank(record.getId())) { record.setId(createId("TaskGroup")); record.setCreateTime(new Date()); - taskGroupMapper.insert(record); + mapper.insert(record); } else { record.setUpdateTime(new Date()); - taskGroupMapper.updateById(record); + mapper.updateById(record); } return record; } @@ -94,7 +89,7 @@ public class SchedulerService extends BaseProviderImpl { public Page queryGroup(Map params) { Page ids = getPage(params); - ids.setRecords(taskGroupMapper.selectIdByMap(ids, params)); + ids.setRecords(mapper.selectIdByMap(ids, params)); Page page = new Page(ids.getCurrent(), ids.getSize()); page.setTotal(ids.getTotal()); diff --git a/iBase4J-Scheduler-Service/src/main/java/org/ibase4j/dao/scheduler/TaskFireLogMapper.java b/iBase4J-Common/src/main/java/org/ibase4j/dao/scheduler/TaskFireLogMapper.java similarity index 94% rename from iBase4J-Scheduler-Service/src/main/java/org/ibase4j/dao/scheduler/TaskFireLogMapper.java rename to iBase4J-Common/src/main/java/org/ibase4j/dao/scheduler/TaskFireLogMapper.java index 0cf7facb..a403ecc2 100644 --- a/iBase4J-Scheduler-Service/src/main/java/org/ibase4j/dao/scheduler/TaskFireLogMapper.java +++ b/iBase4J-Common/src/main/java/org/ibase4j/dao/scheduler/TaskFireLogMapper.java @@ -9,6 +9,6 @@ import org.ibase4j.model.scheduler.TaskFireLog; import com.baomidou.mybatisplus.mapper.BaseMapper; -public interface TaskFireLogMapper extends BaseMapper { +public interface TaskFireLogMapper extends BaseMapper { List selectIdByMap(RowBounds rowBounds, @Param("cm") Map params); } diff --git a/iBase4J-Scheduler-Service/src/main/java/org/ibase4j/dao/scheduler/TaskGroupMapper.java b/iBase4J-Common/src/main/java/org/ibase4j/dao/scheduler/TaskGroupMapper.java similarity index 100% rename from iBase4J-Scheduler-Service/src/main/java/org/ibase4j/dao/scheduler/TaskGroupMapper.java rename to iBase4J-Common/src/main/java/org/ibase4j/dao/scheduler/TaskGroupMapper.java diff --git a/iBase4J-Scheduler-Service/src/main/java/org/ibase4j/dao/scheduler/TaskSchedulerMapper.java b/iBase4J-Common/src/main/java/org/ibase4j/dao/scheduler/TaskSchedulerMapper.java similarity index 100% rename from iBase4J-Scheduler-Service/src/main/java/org/ibase4j/dao/scheduler/TaskSchedulerMapper.java rename to iBase4J-Common/src/main/java/org/ibase4j/dao/scheduler/TaskSchedulerMapper.java diff --git a/iBase4J-Scheduler-API/src/main/java/org/ibase4j/model/scheduler/TaskFireLog.java b/iBase4J-Common/src/main/java/org/ibase4j/model/scheduler/TaskFireLog.java similarity index 100% rename from iBase4J-Scheduler-API/src/main/java/org/ibase4j/model/scheduler/TaskFireLog.java rename to iBase4J-Common/src/main/java/org/ibase4j/model/scheduler/TaskFireLog.java diff --git a/iBase4J-Scheduler-API/src/main/java/org/ibase4j/model/scheduler/TaskGroup.java b/iBase4J-Common/src/main/java/org/ibase4j/model/scheduler/TaskGroup.java similarity index 100% rename from iBase4J-Scheduler-API/src/main/java/org/ibase4j/model/scheduler/TaskGroup.java rename to iBase4J-Common/src/main/java/org/ibase4j/model/scheduler/TaskGroup.java diff --git a/iBase4J-Scheduler-API/src/main/java/org/ibase4j/model/scheduler/TaskScheduler.java b/iBase4J-Common/src/main/java/org/ibase4j/model/scheduler/TaskScheduler.java similarity index 78% rename from iBase4J-Scheduler-API/src/main/java/org/ibase4j/model/scheduler/TaskScheduler.java rename to iBase4J-Common/src/main/java/org/ibase4j/model/scheduler/TaskScheduler.java index 5a260c03..4d99fb63 100644 --- a/iBase4J-Scheduler-API/src/main/java/org/ibase4j/model/scheduler/TaskScheduler.java +++ b/iBase4J-Common/src/main/java/org/ibase4j/model/scheduler/TaskScheduler.java @@ -1,7 +1,5 @@ package org.ibase4j.model.scheduler; -import java.util.Date; - import org.ibase4j.core.base.BaseModel; import com.baomidou.mybatisplus.annotations.TableName; @@ -14,8 +12,6 @@ public class TaskScheduler extends BaseModel { private String taskType; private String taskDesc; private String taskCron; - private Date taskPreviousFireTime; - private Date taskNextFireTime; private String contactEmail; /** @@ -88,34 +84,6 @@ public class TaskScheduler extends BaseModel { this.taskCron = taskCron == null ? null : taskCron.trim(); } - /** - * @return the value of task_scheduler.task_previous_fire_time - */ - public Date getTaskPreviousFireTime() { - return taskPreviousFireTime; - } - - /** - * @param taskPreviousFireTime the value for task_scheduler.task_previous_fire_time - */ - public void setTaskPreviousFireTime(Date taskPreviousFireTime) { - this.taskPreviousFireTime = taskPreviousFireTime; - } - - /** - * @return the value of task_scheduler.task_next_fire_time - */ - public Date getTaskNextFireTime() { - return taskNextFireTime; - } - - /** - * @param taskNextFireTime the value for task_scheduler.task_next_fire_time - */ - public void setTaskNextFireTime(Date taskNextFireTime) { - this.taskNextFireTime = taskNextFireTime; - } - /** * @return the value of task_scheduler.contact_email */ @@ -144,8 +112,6 @@ public class TaskScheduler extends BaseModel { sb.append(", taskType=").append(taskType); sb.append(", taskDesc=").append(taskDesc); sb.append(", taskCron=").append(taskCron); - sb.append(", taskPreviousFireTime=").append(taskPreviousFireTime); - sb.append(", taskNextFireTime=").append(taskNextFireTime); sb.append(", contactEmail=").append(contactEmail); sb.append("]"); return sb.toString(); @@ -172,8 +138,6 @@ public class TaskScheduler extends BaseModel { && (this.getTaskType() == null ? other.getTaskType() == null : this.getTaskType().equals(other.getTaskType())) && (this.getTaskDesc() == null ? other.getTaskDesc() == null : this.getTaskDesc().equals(other.getTaskDesc())) && (this.getTaskCron() == null ? other.getTaskCron() == null : this.getTaskCron().equals(other.getTaskCron())) - && (this.getTaskPreviousFireTime() == null ? other.getTaskPreviousFireTime() == null : this.getTaskPreviousFireTime().equals(other.getTaskPreviousFireTime())) - && (this.getTaskNextFireTime() == null ? other.getTaskNextFireTime() == null : this.getTaskNextFireTime().equals(other.getTaskNextFireTime())) && (this.getContactEmail() == null ? other.getContactEmail() == null : this.getContactEmail().equals(other.getContactEmail())) && (this.getEnable() == null ? other.getEnable() == null : this.getEnable().equals(other.getEnable())) && (this.getCreateBy() == null ? other.getCreateBy() == null : this.getCreateBy().equals(other.getCreateBy())) @@ -195,8 +159,6 @@ public class TaskScheduler extends BaseModel { result = prime * result + ((getTaskType() == null) ? 0 : getTaskType().hashCode()); result = prime * result + ((getTaskDesc() == null) ? 0 : getTaskDesc().hashCode()); result = prime * result + ((getTaskCron() == null) ? 0 : getTaskCron().hashCode()); - result = prime * result + ((getTaskPreviousFireTime() == null) ? 0 : getTaskPreviousFireTime().hashCode()); - result = prime * result + ((getTaskNextFireTime() == null) ? 0 : getTaskNextFireTime().hashCode()); result = prime * result + ((getContactEmail() == null) ? 0 : getContactEmail().hashCode()); result = prime * result + ((getEnable() == null) ? 0 : getEnable().hashCode()); result = prime * result + ((getCreateBy() == null) ? 0 : getCreateBy().hashCode()); diff --git a/iBase4J-Scheduler-API/src/main/java/org/ibase4j/model/scheduler/ext/TaskScheduled.java b/iBase4J-Common/src/main/java/org/ibase4j/model/scheduler/ext/TaskScheduled.java similarity index 100% rename from iBase4J-Scheduler-API/src/main/java/org/ibase4j/model/scheduler/ext/TaskScheduled.java rename to iBase4J-Common/src/main/java/org/ibase4j/model/scheduler/ext/TaskScheduled.java diff --git a/iBase4J-Scheduler-API/src/main/java/org/ibase4j/model/scheduler/ext/TaskSchedulerBean.java b/iBase4J-Common/src/main/java/org/ibase4j/model/scheduler/ext/TaskSchedulerBean.java similarity index 100% rename from iBase4J-Scheduler-API/src/main/java/org/ibase4j/model/scheduler/ext/TaskSchedulerBean.java rename to iBase4J-Common/src/main/java/org/ibase4j/model/scheduler/ext/TaskSchedulerBean.java diff --git a/iBase4J-Scheduler-Service/src/main/resources/config/quartz.properties b/iBase4J-Common/src/main/resources/config/quartz.properties similarity index 100% rename from iBase4J-Scheduler-Service/src/main/resources/config/quartz.properties rename to iBase4J-Common/src/main/resources/config/quartz.properties diff --git a/iBase4J-Scheduler-Service/src/main/resources/mappers/TaskFireLogMapper.xml b/iBase4J-Common/src/main/resources/mappers/TaskFireLogMapper.xml similarity index 96% rename from iBase4J-Scheduler-Service/src/main/resources/mappers/TaskFireLogMapper.xml rename to iBase4J-Common/src/main/resources/mappers/TaskFireLogMapper.xml index 050db606..67c5e519 100644 --- a/iBase4J-Scheduler-Service/src/main/resources/mappers/TaskFireLogMapper.xml +++ b/iBase4J-Common/src/main/resources/mappers/TaskFireLogMapper.xml @@ -1,6 +1,6 @@ - + + \ No newline at end of file diff --git a/iBase4J-Scheduler-Service/src/main/resources/mappers/TaskGroupMapper.xml b/iBase4J-Common/src/main/resources/mappers/TaskGroupMapper.xml similarity index 96% rename from iBase4J-Scheduler-Service/src/main/resources/mappers/TaskGroupMapper.xml rename to iBase4J-Common/src/main/resources/mappers/TaskGroupMapper.xml index 48eb6095..e83670b9 100644 --- a/iBase4J-Scheduler-Service/src/main/resources/mappers/TaskGroupMapper.xml +++ b/iBase4J-Common/src/main/resources/mappers/TaskGroupMapper.xml @@ -8,5 +8,5 @@ and (task_group like CONCAT('%',#{cm.keyword},'%') or group_desc like CONCAT('%',#{cm.keyword},'%')) - + \ No newline at end of file diff --git a/iBase4J-Scheduler-Service/src/main/resources/mappers/TaskSchedulerMapper.xml b/iBase4J-Common/src/main/resources/mappers/TaskSchedulerMapper.xml similarity index 96% rename from iBase4J-Scheduler-Service/src/main/resources/mappers/TaskSchedulerMapper.xml rename to iBase4J-Common/src/main/resources/mappers/TaskSchedulerMapper.xml index 5d7c58ec..57bb4483 100644 --- a/iBase4J-Scheduler-Service/src/main/resources/mappers/TaskSchedulerMapper.xml +++ b/iBase4J-Common/src/main/resources/mappers/TaskSchedulerMapper.xml @@ -9,5 +9,5 @@ and (task_type like CONCAT('%',#{cm.keyword},'%') or task_desc like CONCAT('%',#{cm.keyword},'%')) - + \ No newline at end of file diff --git a/iBase4J-Common/src/main/resources/spring/mq.xml b/iBase4J-Common/src/main/resources/spring/mq.xml index bce2cb8a..b1b7ae94 100644 --- a/iBase4J-Common/src/main/resources/spring/mq.xml +++ b/iBase4J-Common/src/main/resources/spring/mq.xml @@ -33,4 +33,11 @@ + + + + + \ No newline at end of file diff --git a/iBase4J-Common/src/main/resources/spring/mybatis.xml b/iBase4J-Common/src/main/resources/spring/mybatis.xml index c0fa48ad..a08a9339 100644 --- a/iBase4J-Common/src/main/resources/spring/mybatis.xml +++ b/iBase4J-Common/src/main/resources/spring/mybatis.xml @@ -16,7 +16,7 @@ - + diff --git a/iBase4J-Scheduler-Service/src/main/resources/spring/scheduler.xml b/iBase4J-Common/src/main/resources/spring/scheduler.xml similarity index 53% rename from iBase4J-Scheduler-Service/src/main/resources/spring/scheduler.xml rename to iBase4J-Common/src/main/resources/spring/scheduler.xml index 649cfc4e..16acf045 100644 --- a/iBase4J-Scheduler-Service/src/main/resources/spring/scheduler.xml +++ b/iBase4J-Common/src/main/resources/spring/scheduler.xml @@ -2,8 +2,11 @@ + http://www.springframework.org/schema/beans/spring-beans-3.0.xsd + http://code.alibabatech.com/schema/idubbo + http://code.alibabatech.com/schema/idubbo/idubbo.xsd"> @@ -14,20 +17,25 @@ - + - + + - + + + + \ No newline at end of file diff --git a/iBase4J-SYS-Service/pom.xml b/iBase4J-SYS-Service/pom.xml index 60c3d258..c0702168 100644 --- a/iBase4J-SYS-Service/pom.xml +++ b/iBase4J-SYS-Service/pom.xml @@ -54,6 +54,12 @@ druid ${druid.version} + + + org.quartz-scheduler + quartz + ${quartz.version} + org.springframework diff --git a/iBase4J-SYS-Service/src/main/java/org/ibase4j/provider/scheduler/CoreTaskService.java b/iBase4J-SYS-Service/src/main/java/org/ibase4j/provider/scheduler/CoreTaskProviderImpl.java similarity index 75% rename from iBase4J-SYS-Service/src/main/java/org/ibase4j/provider/scheduler/CoreTaskService.java rename to iBase4J-SYS-Service/src/main/java/org/ibase4j/provider/scheduler/CoreTaskProviderImpl.java index 1b46cc20..0b76f3ee 100644 --- a/iBase4J-SYS-Service/src/main/java/org/ibase4j/provider/scheduler/CoreTaskService.java +++ b/iBase4J-SYS-Service/src/main/java/org/ibase4j/provider/scheduler/CoreTaskProviderImpl.java @@ -2,16 +2,17 @@ package org.ibase4j.provider.scheduler; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.ibase4j.core.support.dubbo.spring.annotation.DubboService; +import org.ibase4j.core.provider.scheduler.CoreTaskProvider; import org.ibase4j.provider.sys.ISysSessionProvider; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; /** * @author ShenHuaJie * @version 2016年5月20日 下午3:19:19 */ -@DubboService(interfaceClass = CoreTaskProvider.class) -public class CoreTaskService implements CoreTaskProvider { +@Service("coreTaskProvider") +public class CoreTaskProviderImpl implements CoreTaskProvider { private final Logger logger = LogManager.getLogger(); @Autowired private ISysSessionProvider sessionProvider; diff --git a/iBase4J-SYS-Service/src/main/resources/Spring-config.xml b/iBase4J-SYS-Service/src/main/resources/Spring-config.xml index c9ac835f..ee706a5c 100644 --- a/iBase4J-SYS-Service/src/main/resources/Spring-config.xml +++ b/iBase4J-SYS-Service/src/main/resources/Spring-config.xml @@ -30,6 +30,7 @@ + \ No newline at end of file diff --git a/iBase4J-Scheduler-API/pom.xml b/iBase4J-Scheduler-API/pom.xml deleted file mode 100644 index b770e81a..00000000 --- a/iBase4J-Scheduler-API/pom.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - 4.0.0 - iBase4J-Scheduler-API - iBase4J-Scheduler-API - http://maven.apache.org - jar - - org.ibase4j - iBase4J - 1.0.0 - - - - - org.ibase4j - iBase4J-Common - ${project.version} - - - * - * - - - - - \ No newline at end of file diff --git a/iBase4J-Scheduler-Service/pom.xml b/iBase4J-Scheduler-Service/pom.xml deleted file mode 100644 index c7252fc5..00000000 --- a/iBase4J-Scheduler-Service/pom.xml +++ /dev/null @@ -1,92 +0,0 @@ - - - 4.0.0 - - org.ibase4j - iBase4J - 1.0.0 - - iBase4J-Scheduler-Service - iBase4J-Scheduler-Service - http://maven.apache.org - war - - - 8089 - - - - - org.ibase4j - iBase4J-Common - ${project.version} - - - * - * - - - - - org.ibase4j - iBase4J-Scheduler-API - ${project.version} - - - * - * - - - - - - mysql - mysql-connector-java - ${mysql.version} - - - com.alibaba - druid - ${druid.version} - - - - org.springframework - spring-jdbc - ${spring.version} - - - org.springframework - spring-oxm - ${spring.version} - - - org.springframework - spring-tx - ${spring.version} - - - org.springframework - spring-aop - ${spring.version} - - - - org.quartz-scheduler - quartz - ${quartz.version} - - - - org.aspectj - aspectjrt - ${aspectj.version} - - - org.aspectj - aspectjweaver - ${aspectj.version} - - - \ No newline at end of file diff --git a/iBase4J-Scheduler-Service/src/main/java/org/ibase4j/scheduler/manager/DefaultSchedulerManager.java b/iBase4J-Scheduler-Service/src/main/java/org/ibase4j/scheduler/manager/DefaultSchedulerManager.java deleted file mode 100644 index 54c9ce69..00000000 --- a/iBase4J-Scheduler-Service/src/main/java/org/ibase4j/scheduler/manager/DefaultSchedulerManager.java +++ /dev/null @@ -1,339 +0,0 @@ -package org.ibase4j.scheduler.manager; - -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.ibase4j.core.util.InstanceUtil; -import org.ibase4j.model.scheduler.ext.TaskScheduled; -import org.quartz.CronTrigger; -import org.quartz.JobDetail; -import org.quartz.JobExecutionContext; -import org.quartz.JobKey; -import org.quartz.JobListener; -import org.quartz.Scheduler; -import org.quartz.SchedulerException; -import org.quartz.Trigger; -import org.quartz.impl.matchers.GroupMatcher; -import org.springframework.beans.factory.InitializingBean; - -/** - * 默认的定时任务管理器 - * - * @author ShenHuaJie - * @version 2016年5月27日 上午10:28:26 - */ -public class DefaultSchedulerManager implements SchedulerManager, InitializingBean { - private Logger logger = LogManager.getLogger(this.getClass()); - - private Scheduler scheduler; - - private List triggerLoaders; - - private List jobListeners; - - public void setScheduler(Scheduler scheduler) { - this.scheduler = scheduler; - } - - public void setTriggerLoaders(List triggerLoaders) { - this.triggerLoaders = triggerLoaders; - } - - public void setJobListeners(List jobListeners) { - this.jobListeners = jobListeners; - } - - // 调度初始化入口 - public void afterPropertiesSet() throws Exception { - if (this.jobListeners != null && this.jobListeners.size() > 0) { - if (logger.isInfoEnabled()) { - logger.info("Initing task scheduler[" + this.scheduler.getSchedulerName() + "] , add listener size :" - + this.jobListeners.size()); - } - for (JobListener listener : this.jobListeners) { - if (logger.isInfoEnabled()) { - logger.info("Add JobListener : " + listener.getName()); - } - this.scheduler.getListenerManager().addJobListener(listener); - } - } - - // 根据配置的初始化装载 - if (this.triggerLoaders != null && this.triggerLoaders.size() > 0) { - if (logger.isInfoEnabled()) { - logger.info("Initing task scheduler[" + this.scheduler.getSchedulerName() + "] , trigger loaders size :" - + this.triggerLoaders.size()); - } - for (TriggerLoader loader : this.triggerLoaders) { - if (logger.isInfoEnabled()) { - logger.info("Initing triggerLoader[" + loader.getClass().getName() + "]."); - } - Map loadResultMap = loader.loadTriggers(); - if (loadResultMap != null) { - for (Entry entry : loadResultMap.entrySet()) { - this.addJobDetail(entry.getValue()); - this.addTrigger(entry.getKey()); - } - if (logger.isInfoEnabled()) { - logger.info("Initing triggerLoader[" + loader.getClass().getName() + "] end ."); - } - } else { - logger.warn("No triggers loaded by triggerLoader[" + loader.getClass().getName() + "]."); - } - } - } else { - logger.warn("No TriggerLoader for initing."); - } - } - - private void addTrigger(Trigger trigger) { - Trigger oldTrigger = null; - try { - oldTrigger = scheduler.getTrigger(trigger.getKey()); - } catch (Exception e) { - } - try { - if (oldTrigger == null) { - if (logger.isInfoEnabled()) { - logger.info("Try to add trigger : " + trigger); - } - scheduler.scheduleJob(trigger); - if (!trigger.getJobDataMap().getBoolean("enable")) { - scheduler.pauseTrigger(trigger.getKey()); - } - } else { - updateTrigger(trigger); - } - } catch (SchedulerException e) { - logger.error("Try to add trigger : " + trigger + " cause error : ", e); - } - } - - private void updateTrigger(Trigger trigger) { - Trigger oldTrigger = null; - try { - oldTrigger = scheduler.getTrigger(trigger.getKey()); - } catch (Exception e) { - } - try { - if (oldTrigger != null) { - if (logger.isInfoEnabled()) { - logger.info("Try to update trigger : " + trigger); - } - scheduler.rescheduleJob(trigger.getKey(), trigger); - if (!trigger.getJobDataMap().getBoolean("enable")) { - scheduler.pauseTrigger(trigger.getKey()); - } - } else { - logger.warn("Can't update trigger : " + trigger); - } - } catch (SchedulerException e) { - logger.error("Try to update trigger : " + trigger + ", the old trigger is : " - + (oldTrigger == null ? "null" : oldTrigger.toString()) + " cause error : ", e); - } - } - - private void addJobDetail(JobDetail jobDetail) { - JobDetail oldJobDetail = null; - try { - oldJobDetail = this.scheduler.getJobDetail(jobDetail.getKey()); - } catch (Exception e) { - } - try { - if (oldJobDetail == null) { - if (logger.isInfoEnabled()) { - logger.info("Try to add jobDetail : " + jobDetail); - } - this.scheduler.addJob(jobDetail, true); - } else { - updateJobDetail(jobDetail); - } - } catch (Exception e) { - logger.error("Try to add jobDetail : " + jobDetail + ", the old jobDetail is : " - + (oldJobDetail == null ? "null" : oldJobDetail.toString()) + " cause error : ", e); - } - } - - private void updateJobDetail(JobDetail jobDetail) { - JobDetail oldJobDetail = null; - try { - oldJobDetail = this.scheduler.getJobDetail(jobDetail.getKey()); - } catch (Exception e) { - } - try { - if (oldJobDetail != null) { - if (logger.isInfoEnabled()) { - logger.info("Try to update oldJobDetail : " + oldJobDetail); - } - this.scheduler.addJob(jobDetail, true); - } else { - logger.warn("Can't update JobDetail : " + jobDetail); - } - } catch (SchedulerException e) { - logger.error("Try to update JobDetail : " + jobDetail + ", the old JobDetail is : " - + (oldJobDetail == null ? "null" : oldJobDetail.toString()) + " cause error : ", e); - } - } - - public List getAllJobDetail() { - List result = new LinkedList(); - try { - GroupMatcher matcher = GroupMatcher.jobGroupContains(""); - Set jobKeys = scheduler.getJobKeys(matcher); - for (JobKey jobKey : jobKeys) { - List triggers = scheduler.getTriggersOfJob(jobKey); - for (Trigger trigger : triggers) { - TaskScheduled job = new TaskScheduled(); - job.setTaskName(jobKey.getName()); - job.setTaskGroup(jobKey.getGroup()); - Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey()); - job.setStatus(triggerState.name()); - if (trigger instanceof CronTrigger) { - CronTrigger cronTrigger = (CronTrigger) trigger; - String cronExpression = cronTrigger.getCronExpression(); - job.setTaskCron(cronExpression); - } - job.setPreviousFireTime(trigger.getPreviousFireTime()); - job.setNextFireTime(trigger.getNextFireTime()); - job.setDesc(trigger.getJobDataMap().getString("desc")); - result.add(job); - } - } - } catch (Exception e) { - logger.error("Try to load All JobDetail cause error : ", e); - } - return result; - } - - public JobDetail getJobDetailByTriggerName(Trigger trigger) { - try { - return this.scheduler.getJobDetail(trigger.getJobKey()); - } catch (Exception e) { - logger.error(e.getMessage(), e); - } - return null; - } - - // 获取运行中任务 - public List getRuningJobDetail() { - List jobList = null; - try { - List executingJobs = scheduler.getCurrentlyExecutingJobs(); - jobList = new ArrayList(executingJobs.size()); - for (JobExecutionContext executingJob : executingJobs) { - TaskScheduled job = new TaskScheduled(); - JobDetail jobDetail = executingJob.getJobDetail(); - JobKey jobKey = jobDetail.getKey(); - Trigger trigger = executingJob.getTrigger(); - job.setTaskName(jobKey.getName()); - job.setTaskGroup(jobKey.getGroup()); - Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey()); - job.setStatus(triggerState.name()); - if (trigger instanceof CronTrigger) { - CronTrigger cronTrigger = (CronTrigger) trigger; - String cronExpression = cronTrigger.getCronExpression(); - job.setTaskCron(cronExpression); - } - job.setPreviousFireTime(trigger.getPreviousFireTime()); - job.setNextFireTime(trigger.getNextFireTime()); - job.setDesc(trigger.getJobDataMap().getString("desc")); - jobList.add(job); - } - } catch (Exception e) { - logger.error("Try to load running JobDetail cause error : ", e); - } - return jobList; - } - - // 暂停任务 - public boolean stopJob(TaskScheduled scheduleJob) { - try { - JobKey jobKey = JobKey.jobKey(scheduleJob.getTaskName(), scheduleJob.getTaskGroup()); - scheduler.pauseJob(jobKey); - return true; - } catch (Exception e) { - logger.error("Try to stop Job cause error : ", e); - } - return false; - } - - // 启动任务 - public boolean resumeJob(TaskScheduled scheduleJob) { - try { - JobKey jobKey = JobKey.jobKey(scheduleJob.getTaskName(), scheduleJob.getTaskGroup()); - scheduler.resumeJob(jobKey); - return true; - } catch (Exception e) { - logger.error("Try to resume Job cause error : ", e); - } - return false; - } - - // 执行任务 - public boolean runJob(TaskScheduled scheduleJob) { - try { - JobKey jobKey = JobKey.jobKey(scheduleJob.getTaskName(), scheduleJob.getTaskGroup()); - scheduler.triggerJob(jobKey); - return true; - } catch (Exception e) { - logger.error("Try to resume Job cause error : ", e); - } - return false; - } - - public boolean refreshScheduler() { - try { - // 根据配置的初始化装载 - if (this.triggerLoaders != null && this.triggerLoaders.size() > 0) { - if (logger.isInfoEnabled()) { - logger.info("Initing task scheduler[" + this.scheduler.getSchedulerName() - + "] , trigger loaders size :" + this.triggerLoaders.size()); - } - // 获取原始调度状态 - List scheduleJobs = getAllJobDetail(); - Map stateMap = InstanceUtil.newHashMap(); - for (TaskScheduled scheduleJob : scheduleJobs) { - stateMap.put(scheduleJob.getTaskGroup() + "." + scheduleJob.getTaskName(), scheduleJob.getStatus()); - } - // 清空调度 - scheduler.clear(); - // 加载调度 - for (TriggerLoader loader : this.triggerLoaders) { - if (logger.isInfoEnabled()) { - logger.info("Initing triggerLoader[" + loader.getClass().getName() + "]."); - } - Map loadResultMap = loader.loadTriggers(); - if (loadResultMap != null) { - for (Entry entry : loadResultMap.entrySet()) { - this.addJobDetail(entry.getValue()); - this.addTrigger(entry.getKey()); - JobKey jobKey = entry.getValue().getKey(); - String key = jobKey.getGroup() + "." + jobKey.getName(); - // 新增任务或原来为暂停状态 - if ("PAUSED".equals(stateMap.get(key)) || !stateMap.containsKey(key)) { - scheduler.pauseJob(jobKey); - } - } - if (logger.isInfoEnabled()) { - logger.info("Initing triggerLoader[" + loader.getClass().getName() + "] end ."); - } - } else { - logger.warn("No triggers loaded by triggerLoader[" + loader.getClass().getName() + "]."); - } - } - } else { - logger.warn("No TriggerLoader for initing."); - } - return true; - } catch (Exception e) { - logger.error("Try to refresh scheduler cause error : ", e); - } - return false; - } -} diff --git a/iBase4J-Scheduler-Service/src/main/java/org/ibase4j/scheduler/manager/TriggerLoader.java b/iBase4J-Scheduler-Service/src/main/java/org/ibase4j/scheduler/manager/TriggerLoader.java deleted file mode 100644 index 450c1fec..00000000 --- a/iBase4J-Scheduler-Service/src/main/java/org/ibase4j/scheduler/manager/TriggerLoader.java +++ /dev/null @@ -1,66 +0,0 @@ -package org.ibase4j.scheduler.manager; - -import java.util.List; -import java.util.Map; - -import org.ibase4j.core.util.InstanceUtil; -import org.ibase4j.dao.scheduler.TaskSchedulerMapper; -import org.ibase4j.model.scheduler.TaskGroup; -import org.ibase4j.model.scheduler.TaskScheduler; -import org.ibase4j.service.SchedulerService; -import org.quartz.CronScheduleBuilder; -import org.quartz.Job; -import org.quartz.JobBuilder; -import org.quartz.JobDataMap; -import org.quartz.JobDetail; -import org.quartz.Trigger; -import org.quartz.TriggerBuilder; -import org.springframework.beans.factory.annotation.Autowired; - -/** - * 作业加载器 - * - * @author ShenHueJie - * @version 2016年5月27日 下午4:31:52 - */ -public class TriggerLoader { - @Autowired - private SchedulerService schedulerService; - @Autowired - private TaskSchedulerMapper taskSchedulerMapper; - - private String taskType; // 作业类型 - private Class jobClass; // 执行作业的类 - - public TriggerLoader(String taskType, Class jobClass) { - this.taskType = taskType; - this.jobClass = jobClass; - } - - public Map loadTriggers() { - Map params = InstanceUtil.newHashMap(); - params.put("taskType", taskType); - List taskSchedulerIds = taskSchedulerMapper.selectIdByMap(params); - Map resultMap = InstanceUtil.newHashMap(); - for (String id : taskSchedulerIds) { - TaskScheduler taskScheduler = schedulerService.getSchedulerById(id); - TaskGroup taskGroup = schedulerService.getGroupById(taskScheduler.getGroupId()); - JobDataMap jobDataMap = new JobDataMap(); - jobDataMap.put("id", taskScheduler.getId()); - jobDataMap.put("enable", taskScheduler.getEnable()); - jobDataMap.put("contactEmail", taskScheduler.getContactEmail()); - jobDataMap.put("desc", taskGroup.getGroupDesc() + ":" + taskScheduler.getTaskDesc()); - JobDetail jobDetail = JobBuilder.newJob(jobClass) - .withIdentity(taskScheduler.getTaskName(), taskGroup.getGroupName()) - .withDescription(taskScheduler.getTaskDesc()).storeDurably(true).usingJobData(jobDataMap).build(); - - Trigger trigger = TriggerBuilder.newTrigger() - .withSchedule(CronScheduleBuilder.cronSchedule(taskScheduler.getTaskCron())) - .withIdentity(taskScheduler.getTaskName(), taskGroup.getGroupName()) - .withDescription(taskGroup.getGroupDesc()).forJob(jobDetail).usingJobData(jobDataMap).build(); - - resultMap.put(trigger, jobDetail); - } - return resultMap; - } -} diff --git a/iBase4J-Scheduler-Service/src/main/java/org/ibase4j/scheduler/task/DubboTask.java b/iBase4J-Scheduler-Service/src/main/java/org/ibase4j/scheduler/task/DubboTask.java deleted file mode 100644 index 836f536b..00000000 --- a/iBase4J-Scheduler-Service/src/main/java/org/ibase4j/scheduler/task/DubboTask.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.ibase4j.scheduler.task; - -import org.ibase4j.core.support.dubbo.ReferenceUtil; -import org.ibase4j.scheduler.Constants; -import org.quartz.Job; -import org.quartz.JobDataMap; -import org.quartz.JobExecutionContext; -import org.quartz.JobExecutionException; -import org.quartz.JobKey; -import org.springframework.context.ApplicationContext; - -/** - * Dubbo调用远程作业 - * - * @author ShenHuaJie - * @version 2016年5月27日 下午4:30:46 - */ -public class DubboTask implements Job { - // 作业接口包名 - private String provider = "org.ibase4j.provider.scheduler."; - - public void execute(JobExecutionContext context) throws JobExecutionException { - JobDataMap jobDataMap = context.getJobDetail().getJobDataMap(); - if (Constants.ERROR_STATS.equals(jobDataMap.get("taskStatus"))) { - return; - } - ApplicationContext applicationContext = null; - JobKey jobKey = context.getJobDetail().getKey(); - try { - applicationContext = (ApplicationContext) context.getScheduler().getContext().get("applicationContext"); - Object refer = ReferenceUtil.refer(applicationContext, provider + jobKey.getGroup()); - refer.getClass().getDeclaredMethod(jobKey.getName()).invoke(refer); - } catch (Exception e) { - throw new JobExecutionException(e); - } - } - -} diff --git a/iBase4J-Scheduler-Service/src/main/resources/Spring-config.xml b/iBase4J-Scheduler-Service/src/main/resources/Spring-config.xml deleted file mode 100644 index f504ddd5..00000000 --- a/iBase4J-Scheduler-Service/src/main/resources/Spring-config.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - ${scheduler.jdbc.config.path} - ${system.config.path} - - - - - - ${project.artifactId} - 1${server.port} - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/iBase4J-Scheduler-Service/src/main/resources/config/jdbc.properties b/iBase4J-Scheduler-Service/src/main/resources/config/jdbc.properties deleted file mode 100644 index 26b852f6..00000000 --- a/iBase4J-Scheduler-Service/src/main/resources/config/jdbc.properties +++ /dev/null @@ -1,29 +0,0 @@ -db.driver=com.mysql.jdbc.Driver -#\u8bfb -db.reader.url=jdbc:mysql://127.0.0.1:3306/ibase4j\u003fuseUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&serverTimezone=PRC&useSSL=false -db.reader.username=root -#\u56de\u8c03DBPasswordCallback\u89e3\u5bc6 -db.reader.password=buzhidao -#\u5199 -db.writer.url=jdbc:mysql://127.0.0.1:3306/ibase4j\u003fuseUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&serverTimezone=PRC&useSSL=false -db.writer.username=root -#\u56de\u8c03DBPasswordCallback\u89e3\u5bc6 -db.writer.password=buzhidao -#\u5b9a\u4e49\u521d\u59cb\u8fde\u63a5\u6570 -db.initialSize=20 -#\u5b9a\u4e49\u6700\u5927\u8fde\u63a5\u6570 -db.maxActive=40 -#\u5b9a\u4e49\u6700\u5927\u7a7a\u95f2 -db.maxIdle=20 -#\u5b9a\u4e49\u6700\u5c0f\u7a7a\u95f2 -db.minIdle=1 -#\u5b9a\u4e49\u6700\u957f\u7b49\u5f85\u65f6\u95f4 -db.maxWait=60000 -# -db.timeBetweenEvictionRunsMillis=3000 -# -db.minEvictableIdleTimeMillis=300000 -# -db.maxPoolPreparedStatementPerConnectionSize=20 -# -druid.filters= \ No newline at end of file diff --git a/iBase4J-Scheduler-Service/src/main/resources/log4j2.xml b/iBase4J-Scheduler-Service/src/main/resources/log4j2.xml deleted file mode 100644 index cfdca01a..00000000 --- a/iBase4J-Scheduler-Service/src/main/resources/log4j2.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - \output\logs - - backup - ${project.artifactId} - 5M - DEBUG - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/iBase4J-Scheduler-Service/src/main/resources/spring/mq-listener.xml b/iBase4J-Scheduler-Service/src/main/resources/spring/mq-listener.xml deleted file mode 100644 index 5b66eebe..00000000 --- a/iBase4J-Scheduler-Service/src/main/resources/spring/mq-listener.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/iBase4J-Scheduler-Service/src/main/webapp/META-INF/context.xml b/iBase4J-Scheduler-Service/src/main/webapp/META-INF/context.xml deleted file mode 100644 index fc7145d3..00000000 --- a/iBase4J-Scheduler-Service/src/main/webapp/META-INF/context.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/iBase4J-Scheduler-Service/src/main/webapp/WEB-INF/web.xml b/iBase4J-Scheduler-Service/src/main/webapp/WEB-INF/web.xml deleted file mode 100644 index e9cd1ddc..00000000 --- a/iBase4J-Scheduler-Service/src/main/webapp/WEB-INF/web.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - iBase4J-Scheduler-Service - - webAppRootKey - iBase4J-Scheduler-Service - - - contextConfigLocation - classpath:Spring-config.xml - - - DruidStatView - com.alibaba.druid.support.http.StatViewServlet - - - allow - 127.0.0.1,localhost - - - - loginUsername - druid - - - - loginPassword - druid - - - - DruidStatView - /druid/* - - - org.springframework.web.context.ContextLoaderListener - - - org.springframework.web.util.IntrospectorCleanupListener - - - org.ibase4j.core.listener.ServerListerner - - \ No newline at end of file diff --git a/iBase4J-Web/pom.xml b/iBase4J-Web/pom.xml index 412a4981..2b813dce 100644 --- a/iBase4J-Web/pom.xml +++ b/iBase4J-Web/pom.xml @@ -29,17 +29,6 @@ - - org.ibase4j - iBase4J-Scheduler-API - ${project.version} - - - * - * - - - org.ibase4j iBase4J-SYS-API diff --git a/iBase4J-Web/src/main/java/org/ibase4j/service/scheduler/SchedulerService.java b/iBase4J-Web/src/main/java/org/ibase4j/service/scheduler/SchedulerService.java index cdbee5ec..e8c279b9 100644 --- a/iBase4J-Web/src/main/java/org/ibase4j/service/scheduler/SchedulerService.java +++ b/iBase4J-Web/src/main/java/org/ibase4j/service/scheduler/SchedulerService.java @@ -3,6 +3,7 @@ package org.ibase4j.service.scheduler; import java.util.List; import java.util.Map; +import org.ibase4j.core.provider.scheduler.SchedulerProvider; import org.ibase4j.core.support.Assert; import org.ibase4j.core.support.dubbo.spring.annotation.DubboReference; import org.ibase4j.model.scheduler.TaskFireLog; @@ -10,7 +11,6 @@ import org.ibase4j.model.scheduler.TaskGroup; import org.ibase4j.model.scheduler.TaskScheduler; import org.ibase4j.model.scheduler.ext.TaskScheduled; import org.ibase4j.model.scheduler.ext.TaskSchedulerBean; -import org.ibase4j.provider.scheduler.SchedulerProvider; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.plugins.Page; @@ -50,6 +50,12 @@ public class SchedulerService { return schedulerProvider.openCloseTask(taskGroup, taskName, "stop"); } + public boolean delTask(String taskGroup, String taskName) { + Assert.notNull(taskGroup, "TASKGROUP"); + Assert.notNull(taskName, "TASKNAME"); + return schedulerProvider.delTask(taskGroup, taskName); + } + public Page queryGroup(Map params) { return schedulerProvider.queryGroup(params); } diff --git a/iBase4J-Web/src/main/java/org/ibase4j/web/scheduler/ScheduledController.java b/iBase4J-Web/src/main/java/org/ibase4j/web/scheduler/ScheduledController.java index b302e931..ad025162 100644 --- a/iBase4J-Web/src/main/java/org/ibase4j/web/scheduler/ScheduledController.java +++ b/iBase4J-Web/src/main/java/org/ibase4j/web/scheduler/ScheduledController.java @@ -34,54 +34,64 @@ import io.swagger.annotations.ApiOperation; @Api(value = "调度管理", description = "调度管理") @RequestMapping(value = "/scheduled", method = RequestMethod.POST) public class ScheduledController extends BaseController { - @Autowired - private SchedulerService schedulerService; + @Autowired + private SchedulerService schedulerService; - @RequestMapping("/read/tasks") - @ApiOperation(value = "调度列表") - @RequiresPermissions("task.scheduled.read") - public Object list(ModelMap modelMap) { - Page jobs = schedulerService.getAllTaskDetail(); - return setSuccessModelMap(modelMap, jobs); - } + @RequestMapping("/read/tasks") + @ApiOperation(value = "调度列表") + @RequiresPermissions("task.scheduled.read") + public Object list(ModelMap modelMap) { + Page jobs = schedulerService.getAllTaskDetail(); + return setSuccessModelMap(modelMap, jobs); + } - // 执行 - @RequestMapping("/run/task") - @ApiOperation(value = "立即执行调度") - @RequiresPermissions("task.scheduled.run") - public Object exec(ModelMap modelMap, @RequestParam(value = "taskGroup", required = false) String taskGroup, - @RequestParam(value = "taskName", required = false) String taskName) { - schedulerService.execTask(taskGroup, taskName); - return setSuccessModelMap(modelMap); - } + // 执行 + @RequestMapping("/run/task") + @ApiOperation(value = "立即执行调度") + @RequiresPermissions("task.scheduled.run") + public Object exec(ModelMap modelMap, @RequestParam(value = "taskGroup", required = true) String taskGroup, + @RequestParam(value = "taskName", required = true) String taskName) { + schedulerService.execTask(taskGroup, taskName); + return setSuccessModelMap(modelMap); + } - // 启动 - @RequestMapping("/open/task") - @ApiOperation(value = "启动调度") - @RequiresPermissions("task.scheduled.open") - public Object open(ModelMap modelMap, @RequestParam(value = "taskGroup", required = false) String taskGroup, - @RequestParam(value = "taskName", required = false) String taskName) { - schedulerService.openTask(taskGroup, taskName); - return setSuccessModelMap(modelMap); - } + // 启动 + @RequestMapping("/open/task") + @ApiOperation(value = "启动调度") + @RequiresPermissions("task.scheduled.open") + public Object open(ModelMap modelMap, @RequestParam(value = "taskGroup", required = true) String taskGroup, + @RequestParam(value = "taskName", required = true) String taskName) { + schedulerService.openTask(taskGroup, taskName); + return setSuccessModelMap(modelMap); + } - // 暂停 - @RequestMapping("/close/task") - @ApiOperation(value = "暂停调度") - @RequiresPermissions("task.scheduled.close") - public Object close(ModelMap modelMap, @RequestParam(value = "taskGroup", required = false) String taskGroup, - @RequestParam(value = "taskName", required = false) String taskName) { - schedulerService.closeTask(taskGroup, taskName); - return setSuccessModelMap(modelMap); - } + // 暂停 + @RequestMapping("/close/task") + @ApiOperation(value = "暂停调度") + @RequiresPermissions("task.scheduled.close") + public Object close(ModelMap modelMap, @RequestParam(value = "taskGroup", required = true) String taskGroup, + @RequestParam(value = "taskName", required = true) String taskName) { + schedulerService.closeTask(taskGroup, taskName); + return setSuccessModelMap(modelMap); + } - // 执行记录 - @RequestMapping("/read/log") - @ApiOperation(value = "调度执行记录") - @RequiresPermissions("task.log.read") - public Object getFireLog(HttpServletRequest request, ModelMap modelMap) { - Map params = WebUtil.getParameterMap(request); - Page list = schedulerService.queryLog(params); - return setSuccessModelMap(modelMap, list); - } + // 暂停 + @RequestMapping("/del/task") + @ApiOperation(value = "暂停调度") + @RequiresPermissions("task.scheduled.close") + public Object delete(ModelMap modelMap, @RequestParam(value = "taskGroup", required = true) String taskGroup, + @RequestParam(value = "taskName", required = true) String taskName) { + schedulerService.delTask(taskGroup, taskName); + return setSuccessModelMap(modelMap); + } + + // 执行记录 + @RequestMapping("/read/log") + @ApiOperation(value = "调度执行记录") + @RequiresPermissions("task.log.read") + public Object getFireLog(HttpServletRequest request, ModelMap modelMap) { + Map params = WebUtil.getParameterMap(request); + Page list = schedulerService.queryLog(params); + return setSuccessModelMap(modelMap, list); + } } diff --git a/iBase4J.sql b/iBase4J.sql index 8352e595..23a7209e 100644 --- a/iBase4J.sql +++ b/iBase4J.sql @@ -685,7 +685,7 @@ CREATE TABLE IF NOT EXISTS `task_group` ( -- 正在导出表 ibase4j.task_group 的数据:~0 rows (大约) /*!40000 ALTER TABLE `task_group` DISABLE KEYS */; INSERT INTO `task_group` (`id_`, `group_name`, `group_desc`, `remark_`, `enable_`, `create_time`, `create_by`, `update_time`, `update_by`) VALUES - ('1', 'CoreTaskProvider', '系统管理', '', 1, '2016-05-27 14:56:51', '1', '2016-06-16 10:18:58', '1'); + ('1', 'coreTaskProvider', '系统管理', '', 1, '2016-05-27 14:56:51', '1', '2016-06-16 10:18:58', '1'); /*!40000 ALTER TABLE `task_group` ENABLE KEYS */; @@ -698,8 +698,6 @@ CREATE TABLE IF NOT EXISTS `task_scheduler` ( `task_type` varchar(50) NOT NULL, `task_desc` varchar(50) DEFAULT NULL, `task_cron` varchar(50) NOT NULL, - `task_previous_fire_time` datetime NOT NULL, - `task_next_fire_time` datetime NOT NULL, `contact_email` varchar(500) DEFAULT NULL COMMENT '多个邮箱用,分割', `remark_` varchar(5000) DEFAULT NULL, `enable_` tinyint(1) DEFAULT '1', @@ -713,8 +711,8 @@ CREATE TABLE IF NOT EXISTS `task_scheduler` ( -- 正在导出表 ibase4j.task_scheduler 的数据:~0 rows (大约) /*!40000 ALTER TABLE `task_scheduler` DISABLE KEYS */; -INSERT INTO `task_scheduler` (`id_`, `group_id`, `task_name`, `task_type`, `task_desc`, `task_cron`, `task_previous_fire_time`, `task_next_fire_time`, `contact_email`, `remark_`, `enable_`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES - ('1', '1', 'cleanExpiredSessions', 'dubbo', '清理无效session', '0 * * * * ?', '2016-09-21 11:30:00', '2016-09-21 12:00:00', 'iBase4J@126.com', NULL, 1, '1', '2016-06-13 14:05:30', '1', '2016-09-21 11:30:00'); +INSERT INTO `task_scheduler` (`id_`, `group_id`, `task_name`, `task_type`, `task_desc`, `task_cron`, `contact_email`, `remark_`, `enable_`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES + ('1', '1', 'cleanExpiredSessions', 'dubbo', '清理无效session', '0 * * * * ?', 'iBase4J@126.com', NULL, 1, '1', '2016-06-13 14:05:30', '1', '2016-09-21 11:30:00'); /*!40000 ALTER TABLE `task_scheduler` ENABLE KEYS */; /*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */; /*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */; diff --git a/pom-biz-web-server.xml b/pom-biz-web-server.xml index a203002a..38b7c571 100644 --- a/pom-biz-web-server.xml +++ b/pom-biz-web-server.xml @@ -15,7 +15,6 @@ iBase4J-Common iBase4J-SYS-API - iBase4J-Scheduler-API iBase4J-Biz-API iBase4J-Web diff --git a/pom-scheduler-server.xml b/pom-scheduler-server.xml deleted file mode 100644 index b9f2976d..00000000 --- a/pom-scheduler-server.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - 4.0.0 - iBase4J-Scheduler-Server - ${project.artifactId} - pom - http://maven.apache.org - - org.ibase4j - iBase4J - 1.0.0 - ./ - - - iBase4J-Common - iBase4J-Scheduler-API - iBase4J-Scheduler-Service - - - \ No newline at end of file diff --git a/pom-web-server.xml b/pom-web-server.xml index e93684f8..5c601bcc 100644 --- a/pom-web-server.xml +++ b/pom-web-server.xml @@ -15,7 +15,6 @@ iBase4J-Common iBase4J-SYS-API - iBase4J-Scheduler-API iBase4J-Web diff --git a/pom.xml b/pom.xml index 2067c091..9be6c863 100644 --- a/pom.xml +++ b/pom.xml @@ -10,8 +10,6 @@ http://maven.apache.org iBase4J-Common - iBase4J-Scheduler-API - iBase4J-Scheduler-Service iBase4J-SYS-API iBase4J-SYS-Service iBase4J-Web @@ -38,7 +36,7 @@ 3.4.1 1.3.0 - 1.4.6 + 2.0-rc 1.7.9 2.4.1 -- Gitee