diff --git a/doc/db/tables_xxl_log.sql b/doc/db/tables_xxl_log.sql index 867b328325631a7f63b98cee3865c76dca97b766..a0454b5b53198efba17a3b67913dcbd27360b40b 100644 --- a/doc/db/tables_xxl_log.sql +++ b/doc/db/tables_xxl_log.sql @@ -9,8 +9,8 @@ # DROP TABLE IF EXISTS XXL_JOB_QRTZ_TRIGGERS; # DROP TABLE IF EXISTS XXL_JOB_QRTZ_JOB_DETAILS; # DROP TABLE IF EXISTS XXL_JOB_QRTZ_CALENDARS; -# DROP TABLE IF EXISTS `xxl_job_qrtz_trigger_log`; # DROP TABLE IF EXISTS `xxl_job_qrtz_trigger_info`; +# DROP TABLE IF EXISTS `xxl_job_qrtz_trigger_log`; CREATE TABLE XXL_JOB_QRTZ_JOB_DETAILS ( @@ -157,29 +157,32 @@ CREATE TABLE XXL_JOB_QRTZ_LOCKS ); -CREATE TABLE `xxl_job_qrtz_trigger_log` ( +DROP TABLE IF EXISTS `xxl_job_qrtz_trigger_info`; +CREATE TABLE `xxl_job_qrtz_trigger_info` ( `id` int(11) NOT NULL AUTO_INCREMENT, `job_group` varchar(255) NOT NULL COMMENT '任务组', `job_name` varchar(255) NOT NULL COMMENT '任务名', - `job_cron` varchar(128) NOT NULL COMMENT '任务执行CORN表达式', + `job_cron` varchar(128) NOT NULL COMMENT '任务执行CORN', + `job_desc` varchar(255) NOT NULL, `job_class` varchar(255) NOT NULL COMMENT '任务执行JobBean', - `job_data` varchar(2048) DEFAULT NULL COMMENT '任务执行数据', - `trigger_time` datetime DEFAULT NULL COMMENT '调度-时间', - `trigger_status` varchar(255) DEFAULT NULL COMMENT '调度-结果', - `trigger_msg` varchar(2048) DEFAULT NULL COMMENT '调度-日志', - `handle_time` datetime DEFAULT NULL COMMENT '执行-时间', - `handle_status` varchar(255) DEFAULT NULL COMMENT '执行-状态', - `handle_msg` varchar(2048) DEFAULT NULL COMMENT '执行-日志', + `job_data` varchar(512) DEFAULT NULL COMMENT '任务执行数据', + `add_time` datetime DEFAULT NULL, + `update_time` datetime DEFAULT NULL, + `author` varchar(64) DEFAULT NULL COMMENT '作者', + `alarm_email` varchar(255) DEFAULT NULL COMMENT '报警邮件', + `alarm_threshold` int(11) DEFAULT NULL COMMENT '报警阀值(连续失败次数)', PRIMARY KEY (`id`) ); +DROP TABLE IF EXISTS `xxl_job_qrtz_trigger_log`; CREATE TABLE `xxl_job_qrtz_trigger_log` ( `id` int(11) NOT NULL AUTO_INCREMENT, `job_group` varchar(255) NOT NULL COMMENT '任务组', `job_name` varchar(255) NOT NULL COMMENT '任务名', `job_cron` varchar(128) NOT NULL COMMENT '任务执行CORN表达式', + `job_desc` varchar(255) NOT NULL, `job_class` varchar(255) NOT NULL COMMENT '任务执行JobBean', - `job_data` varchar(2048) DEFAULT NULL COMMENT '任务执行数据', + `job_data` varchar(512) DEFAULT NULL COMMENT '任务执行数据', `trigger_time` datetime DEFAULT NULL COMMENT '调度-时间', `trigger_status` varchar(255) DEFAULT NULL COMMENT '调度-结果', `trigger_msg` varchar(2048) DEFAULT NULL COMMENT '调度-日志', diff --git a/pom.xml b/pom.xml index 83db59fd5b7e737e7b8b5ce18737a5686fa7424e..a434dd4baea35043b9f5bfe84a10c6be67f8b3b5 100644 --- a/pom.xml +++ b/pom.xml @@ -3,13 +3,12 @@ 4.0.0 com.xxl xxl-job - 1.1.1-SNAPSHOT + 1.2.0-SNAPSHOT pom xxl-job-admin xxl-job-client xxl-job-client-demo - xxl-job-simple diff --git a/xxl-job-admin/pom.xml b/xxl-job-admin/pom.xml index b6215796992bf53b12c90b42fbe46f57f5b22e4f..73579e70370e180351fa1253254ef9bdbb2af4f9 100644 --- a/xxl-job-admin/pom.xml +++ b/xxl-job-admin/pom.xml @@ -4,10 +4,10 @@ com.xxl xxl-job - 1.1.1-SNAPSHOT + 1.2.0-SNAPSHOT xxl-job-admin - 1.1.2-SNAPSHOT + 1.2.1-SNAPSHOT war @@ -123,13 +123,6 @@ 5.1.29 - - - org.quartz-scheduler - quartz - 2.2.2 - - org.apache.httpcomponents @@ -137,11 +130,18 @@ 4.3.6 + + + org.quartz-scheduler + quartz + 2.2.2 + + com.xxl xxl-job-client - 1.1.2-SNAPSHOT + 1.2.1-SNAPSHOT diff --git a/xxl-job-admin/src/main/java/com/xxl/job/controller/JobInfoController.java b/xxl-job-admin/src/main/java/com/xxl/job/controller/JobInfoController.java index 66cf56c06e1e5628a732c3a3166e00aa2e233f8f..05962f449cb95726a6331615802fe148dab37326 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/controller/JobInfoController.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/controller/JobInfoController.java @@ -24,14 +24,15 @@ import com.xxl.job.core.model.ReturnT; import com.xxl.job.core.model.XxlJobInfo; import com.xxl.job.core.util.DynamicSchedulerUtil; import com.xxl.job.dao.IXxlJobInfoDao; -import com.xxl.job.service.job.HttpJobBean; -import com.xxl.job.service.job.LocalJobBean; -import com.xxl.job.service.job.LocalJobBeanB; +import com.xxl.job.service.job.RemoteHttpJobBean; +import com.xxl.job.service.job.impl.DemoConcurrentJobBean; +import com.xxl.job.service.job.impl.DemoNomalJobBean; /** * index controller * @author xuxueli 2015-12-19 16:13:16 */ +@SuppressWarnings("unchecked") @Controller @RequestMapping("/jobinfo") public class JobInfoController { @@ -40,12 +41,12 @@ public class JobInfoController { private IXxlJobInfoDao xxlJobInfoDao; // remote job bean - public static Class remoteJobBean = HttpJobBean.class; + public static Class remoteJobBean = RemoteHttpJobBean.class; // loacal job bean public static List> localJobBeanList = new ArrayList>(); static{ - localJobBeanList.add(LocalJobBean.class); - localJobBeanList.add(LocalJobBeanB.class); + localJobBeanList.add((Class) DemoNomalJobBean.class); + localJobBeanList.add((Class) DemoConcurrentJobBean.class); } @RequestMapping @@ -81,12 +82,11 @@ public class JobInfoController { return maps; } - @SuppressWarnings("unchecked") @RequestMapping("/add") @ResponseBody public ReturnT add(String jobGroup, String jobName, String jobCron, String jobDesc, String jobClass, String handler_params, String handler_address, String handler_name, - String author, String alarm_email, int alarm_threshold) { + String author, String alarmEmail, int alarmThreshold) { // valid if (JobGroupEnum.match(jobGroup) == null) { @@ -124,7 +124,7 @@ public class JobInfoController { if (StringUtils.isBlank(author)) { return new ReturnT(500, "请输入“负责人”"); } - if (StringUtils.isBlank(alarm_email)) { + if (StringUtils.isBlank(alarmEmail)) { return new ReturnT(500, "请输入“报警邮件”"); } @@ -137,6 +137,7 @@ public class JobInfoController { return new ReturnT(500, "此任务已存在,请更换任务组或任务名"); } + // parse jobDataMap HashMap jobDataMap = new HashMap(); jobDataMap.put(HandlerRepository.HANDLER_PARAMS, handler_params); jobDataMap.put(HandlerRepository.HANDLER_ADDRESS, handler_address); @@ -151,8 +152,8 @@ public class JobInfoController { jobInfo.setJobClass(jobClass); jobInfo.setJobData(JacksonUtil.writeValueAsString(jobDataMap)); jobInfo.setAuthor(author); - jobInfo.setAlarmEmail(alarm_email); - jobInfo.setAlarmThreshold(alarm_threshold); + jobInfo.setAlarmEmail(alarmEmail); + jobInfo.setAlarmThreshold(alarmThreshold); xxlJobInfoDao.save(jobInfo); try { @@ -174,7 +175,7 @@ public class JobInfoController { @ResponseBody public ReturnT reschedule(String jobGroup, String jobName, String jobCron, String jobDesc, String jobClass, String handler_params, String handler_address, String handler_name, - String author, String alarm_email, int alarm_threshold) { + String author, String alarmEmail, int alarmThreshold) { // valid if (JobGroupEnum.match(jobGroup) == null) { @@ -187,8 +188,19 @@ public class JobInfoController { return new ReturnT(500, "“corn”不合法"); } + // parse jobDataMap + HashMap jobDataMap = new HashMap(); + jobDataMap.put(HandlerRepository.HANDLER_PARAMS, handler_params); + jobDataMap.put(HandlerRepository.HANDLER_ADDRESS, handler_address); + jobDataMap.put(HandlerRepository.HANDLER_NAME, handler_name); + XxlJobInfo jobInfo = xxlJobInfoDao.load(jobGroup, jobName); jobInfo.setJobCron(jobCron); + jobInfo.setJobDesc(jobDesc); + jobInfo.setJobData(JacksonUtil.writeValueAsString(jobDataMap)); + jobInfo.setAuthor(author); + jobInfo.setAlarmEmail(alarmEmail); + jobInfo.setAlarmThreshold(alarmThreshold); try { // fresh quartz diff --git a/xxl-job-admin/src/main/java/com/xxl/job/dao/impl/XxlJobLogDaoImpl.java b/xxl-job-admin/src/main/java/com/xxl/job/dao/impl/XxlJobLogDaoImpl.java index ef62845455383f87703061c08457eef47d7654fb..eee665a6761b807e0054ad300ef3b14c7fc9c434 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/dao/impl/XxlJobLogDaoImpl.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/dao/impl/XxlJobLogDaoImpl.java @@ -71,7 +71,7 @@ public class XxlJobLogDaoImpl implements IXxlJobLogDao { @Override public int updateTriggerInfo(XxlJobLog xxlJobLog) { - if (xxlJobLog!=null && xxlJobLog.getTriggerMsg().length()>2000) { + if (xxlJobLog!=null && xxlJobLog.getTriggerMsg()!=null && xxlJobLog.getTriggerMsg().length()>2000) { xxlJobLog.setTriggerMsg(xxlJobLog.getTriggerMsg().substring(0, 2000)); } return sqlSessionTemplate.update("XxlJobLogMapper.updateTriggerInfo", xxlJobLog); @@ -79,7 +79,7 @@ public class XxlJobLogDaoImpl implements IXxlJobLogDao { @Override public int updateHandleInfo(XxlJobLog xxlJobLog) { - if (xxlJobLog!=null && xxlJobLog.getHandleMsg().length()>2000) { + if (xxlJobLog!=null && xxlJobLog.getHandleMsg()!=null && xxlJobLog.getHandleMsg().length()>2000) { xxlJobLog.setHandleMsg(xxlJobLog.getHandleMsg().substring(0, 2000)); } return sqlSessionTemplate.update("XxlJobLogMapper.updateHandleInfo", xxlJobLog); diff --git a/xxl-job-admin/src/main/java/com/xxl/job/service/job/LocalJobBean.java b/xxl-job-admin/src/main/java/com/xxl/job/service/job/LocalJobBean.java deleted file mode 100644 index 620772603a7f8f929578cca73715414de5e5254a..0000000000000000000000000000000000000000 --- a/xxl-job-admin/src/main/java/com/xxl/job/service/job/LocalJobBean.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.xxl.job.service.job; - -import java.util.HashMap; -import java.util.Map; -import java.util.Map.Entry; -import java.util.concurrent.TimeUnit; - -import org.quartz.DisallowConcurrentExecution; -import org.quartz.JobExecutionContext; -import org.quartz.JobExecutionException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.scheduling.quartz.QuartzJobBean; - -/** - * http job bean - * @author xuxueli 2015-12-17 18:20:34 - */ - -@DisallowConcurrentExecution // 串行;线程数要多配置几个,否则不生效; -public class LocalJobBean extends QuartzJobBean { - private static Logger logger = LoggerFactory.getLogger(LocalJobBean.class); - - @Override - protected void executeInternal(JobExecutionContext context) - throws JobExecutionException { - - String triggerKey = context.getTrigger().getKey().getName(); - String triggerGroup = context.getTrigger().getKey().getGroup(); - Map jobDataMap = context.getMergedJobDataMap().getWrappedMap(); - - // jobDataMap 2 params - Map params = new HashMap(); - if (jobDataMap!=null && jobDataMap.size()>0) { - for (Entry item : jobDataMap.entrySet()) { - params.put(item.getKey(), String.valueOf(item.getValue())); - } - } - - try { - TimeUnit.SECONDS.sleep(5); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - logger.info(">>>>>>>>>>> xxl-job run :jobId:{}, group:{}, jobDataMap:{}", - new Object[]{triggerKey, triggerGroup, jobDataMap}); - } - -} \ No newline at end of file diff --git a/xxl-job-admin/src/main/java/com/xxl/job/service/job/LocalJobBeanB.java b/xxl-job-admin/src/main/java/com/xxl/job/service/job/LocalJobBeanB.java deleted file mode 100644 index 5868e71dfdd22d414a6f5ba20193a1d645a72f8a..0000000000000000000000000000000000000000 --- a/xxl-job-admin/src/main/java/com/xxl/job/service/job/LocalJobBeanB.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.xxl.job.service.job; - -import java.util.HashMap; -import java.util.Map; -import java.util.Map.Entry; -import java.util.concurrent.TimeUnit; - -import org.quartz.JobExecutionContext; -import org.quartz.JobExecutionException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.scheduling.quartz.QuartzJobBean; - -/** - * http job bean - * @author xuxueli 2015-12-17 18:20:34 - */ - -public class LocalJobBeanB extends QuartzJobBean { - private static Logger logger = LoggerFactory.getLogger(LocalJobBeanB.class); - - @Override - protected void executeInternal(JobExecutionContext context) - throws JobExecutionException { - - String triggerKey = context.getTrigger().getKey().getName(); - String triggerGroup = context.getTrigger().getKey().getGroup(); - Map jobDataMap = context.getMergedJobDataMap().getWrappedMap(); - - // jobDataMap 2 params - Map params = new HashMap(); - if (jobDataMap!=null && jobDataMap.size()>0) { - for (Entry item : jobDataMap.entrySet()) { - params.put(item.getKey(), String.valueOf(item.getValue())); - } - } - - try { - TimeUnit.SECONDS.sleep(5); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - logger.info(">>>>>>>>>>> xxl-job run :jobId:{}, group:{}, jobDataMap:{}", - new Object[]{triggerKey, triggerGroup, jobDataMap}); - } - -} \ No newline at end of file diff --git a/xxl-job-admin/src/main/java/com/xxl/job/service/job/LocalNomalJobBean.java b/xxl-job-admin/src/main/java/com/xxl/job/service/job/LocalNomalJobBean.java new file mode 100644 index 0000000000000000000000000000000000000000..8e522f92be5cf8f3ef43f2a14b36b216cb6c5775 --- /dev/null +++ b/xxl-job-admin/src/main/java/com/xxl/job/service/job/LocalNomalJobBean.java @@ -0,0 +1,90 @@ +package com.xxl.job.service.job; + +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.lang.StringUtils; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.quartz.JobKey; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.scheduling.quartz.QuartzJobBean; + +import com.xxl.job.client.handler.HandlerRepository; +import com.xxl.job.client.util.HttpUtil; +import com.xxl.job.client.util.JacksonUtil; +import com.xxl.job.core.model.XxlJobInfo; +import com.xxl.job.core.model.XxlJobLog; +import com.xxl.job.core.util.DynamicSchedulerUtil; + +/** + * http job bean + * @author xuxueli 2015-12-17 18:20:34 + */ +public abstract class LocalNomalJobBean extends QuartzJobBean { + private static Logger logger = LoggerFactory.getLogger(LocalNomalJobBean.class); + + @Override + protected void executeInternal(JobExecutionContext context) + throws JobExecutionException { + JobKey jobKey = context.getTrigger().getJobKey(); + + XxlJobInfo jobInfo = DynamicSchedulerUtil.xxlJobInfoDao.load(jobKey.getGroup(), jobKey.getName()); + @SuppressWarnings("unchecked") + HashMap jobDataMap = (HashMap) JacksonUtil.readValueRefer(jobInfo.getJobData(), Map.class); + + // save log + XxlJobLog jobLog = new XxlJobLog(); + jobLog.setJobGroup(jobInfo.getJobGroup()); + jobLog.setJobName(jobInfo.getJobName()); + jobLog.setJobCron(jobInfo.getJobCron()); + jobLog.setJobDesc(jobInfo.getJobDesc()); + jobLog.setJobClass(jobInfo.getJobClass()); + jobLog.setJobData(jobInfo.getJobData()); + + jobLog.setJobClass(RemoteHttpJobBean.class.getName()); + jobLog.setJobData(jobInfo.getJobData()); + DynamicSchedulerUtil.xxlJobLogDao.save(jobLog); + logger.info(">>>>>>>>>>> xxl-job trigger start, jobLog:{}", jobLog); + + // trigger request + String handler_params = jobDataMap.get(HandlerRepository.HANDLER_PARAMS); + String[] handlerParams = null; + if (StringUtils.isNotBlank(handler_params)) { + handlerParams = handler_params.split(","); + } + + jobLog.setTriggerTime(new Date()); + jobLog.setTriggerStatus(HttpUtil.SUCCESS); + jobLog.setTriggerMsg(null); + + try { + Object responseMsg = this.handle(handlerParams); + + jobLog.setHandleTime(new Date()); + jobLog.setHandleStatus(HttpUtil.SUCCESS); + jobLog.setHandleMsg(JacksonUtil.writeValueAsString(responseMsg)); + } catch (Exception e) { + logger.info("HandlerThread Exception:", e); + StringWriter out = new StringWriter(); + e.printStackTrace(new PrintWriter(out)); + + jobLog.setHandleTime(new Date()); + jobLog.setHandleStatus(HttpUtil.FAIL); + jobLog.setHandleMsg(out.toString()); + } + + // update trigger info + DynamicSchedulerUtil.xxlJobLogDao.updateTriggerInfo(jobLog); + DynamicSchedulerUtil.xxlJobLogDao.updateHandleInfo(jobLog); + logger.info(">>>>>>>>>>> xxl-job trigger end, jobLog.id:{}, jobLog:{}", jobLog.getId(), jobLog); + + } + + public abstract Object handle(String... param); + +} \ No newline at end of file diff --git a/xxl-job-admin/src/main/java/com/xxl/job/service/job/HttpJobBean.java b/xxl-job-admin/src/main/java/com/xxl/job/service/job/RemoteHttpJobBean.java similarity index 92% rename from xxl-job-admin/src/main/java/com/xxl/job/service/job/HttpJobBean.java rename to xxl-job-admin/src/main/java/com/xxl/job/service/job/RemoteHttpJobBean.java index ab35dd13f1fd673e8a298377742d4f239277eb95..7b071317b5ca899ef22126bda8d89590ab876c7f 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/service/job/HttpJobBean.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/service/job/RemoteHttpJobBean.java @@ -27,8 +27,8 @@ import com.xxl.job.core.util.PropertiesUtil; * @author xuxueli 2015-12-17 18:20:34 */ @DisallowConcurrentExecution -public class HttpJobBean extends QuartzJobBean { - private static Logger logger = LoggerFactory.getLogger(HttpJobBean.class); +public class RemoteHttpJobBean extends QuartzJobBean { + private static Logger logger = LoggerFactory.getLogger(RemoteHttpJobBean.class); @SuppressWarnings("unchecked") @Override @@ -47,7 +47,7 @@ public class HttpJobBean extends QuartzJobBean { jobLog.setJobClass(jobInfo.getJobClass()); jobLog.setJobData(jobInfo.getJobData()); - jobLog.setJobClass(HttpJobBean.class.getName()); + jobLog.setJobClass(RemoteHttpJobBean.class.getName()); jobLog.setJobData(jobInfo.getJobData()); DynamicSchedulerUtil.xxlJobLogDao.save(jobLog); logger.info(">>>>>>>>>>> xxl-job trigger start, jobLog:{}", jobLog); diff --git a/xxl-job-admin/src/main/resources/config.properties b/xxl-job-admin/src/main/resources/config.properties index 9d6ac149a3d0209c2403869136dda04ff9d3c8dd..606ed64274f6fa84a2278588ee65ff8ea4708ffb 100644 --- a/xxl-job-admin/src/main/resources/config.properties +++ b/xxl-job-admin/src/main/resources/config.properties @@ -1 +1 @@ -triggerLogUrl=http://localhost:8080/xxl-job-admin/joblog/save \ No newline at end of file +trigger_log_url=http://localhost:8080/xxl-job-admin/joblog/save \ No newline at end of file diff --git a/xxl-job-admin/src/main/webapp/WEB-INF/template/jobinfo/index.ftl b/xxl-job-admin/src/main/webapp/WEB-INF/template/jobinfo/index.ftl index d1cde5f33e7eb80204784cbfcf7b00be3780a99b..3dec89c375729e08e7fbe44b09585eaca3bd1ac8 100644 --- a/xxl-job-admin/src/main/webapp/WEB-INF/template/jobinfo/index.ftl +++ b/xxl-job-admin/src/main/webapp/WEB-INF/template/jobinfo/index.ftl @@ -148,11 +148,11 @@
-
+
-
+
@@ -168,35 +168,49 @@