diff --git a/README.md b/README.md index dfd1829708df725af386c74ffbbbb1deda457438..24b6a15ff61f407584b63e80abb38fca3532f229 100644 --- a/README.md +++ b/README.md @@ -780,8 +780,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 3、任务权限管理; - 4、执行器,server启动,注册逻辑调整; - 5、调度失败重试机制; - -- 7、JobHandler开启多线程时,支持记录执行日志; +- 6、JobHandler开启多线程时,支持记录执行日志; ## 七、其他 diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/IndexController.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/IndexController.java index 7c5350ef744d9f9b22beb7a70fe12d613b38d2e8..f96189e185b8f2baa97e8fa3d65d996a812d335d 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/IndexController.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/IndexController.java @@ -3,6 +3,7 @@ package com.xxl.job.admin.controller; import com.xxl.job.admin.controller.annotation.PermessionLimit; import com.xxl.job.admin.controller.interceptor.PermissionInterceptor; import com.xxl.job.admin.core.util.PropertiesUtil; +import com.xxl.job.admin.service.IXxlJobService; import com.xxl.job.core.biz.model.ReturnT; import org.apache.commons.lang.StringUtils; import org.springframework.stereotype.Controller; @@ -11,8 +12,10 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; +import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.util.Map; /** * index controller @@ -21,13 +24,16 @@ import javax.servlet.http.HttpServletResponse; @Controller public class IndexController { + @Resource + private IXxlJobService xxlJobService; + @RequestMapping("/") - @PermessionLimit(limit=false) - public String index(Model model, HttpServletRequest request) { - if (!PermissionInterceptor.ifLogin(request)) { - return "redirect:/toLogin"; - } - return "redirect:/jobinfo"; + public String index(Model model) { + + Map dashboardMap = xxlJobService.dashboardInfo(); + model.addAllAttributes(dashboardMap); + + return "index"; } @RequestMapping("/toLogin") @@ -71,6 +77,11 @@ public class IndexController { @RequestMapping("/help") public String help() { + + /*if (!PermissionInterceptor.ifLogin(request)) { + return "redirect:/toLogin"; + }*/ + return "help"; } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java index 59ca770d4af8b940915f4b6f3e93c95ab0e2c8b9..f4506a93f50fcda580c974f9acac9b8160b75184 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java @@ -120,10 +120,12 @@ public class JobLogController { ReturnT logResult = executorBiz.log(triggerTime, logId, fromLineNum); // is end - /*XxlJobLog jobLog = xxlJobLogDao.load(logId); - if (jobLog.getHandleCode() > 0) { - logResult.getContent().setEnd(true); - }*/ + if (logResult.getContent()!=null && logResult.getContent().getFromLineNum() > logResult.getContent().getToLineNum()) { + XxlJobLog jobLog = xxlJobLogDao.load(logId); + if (jobLog.getHandleCode() > 0) { + logResult.getContent().setEnd(true); + } + } return logResult; } catch (Exception e) { diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/IXxlJobInfoDao.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/IXxlJobInfoDao.java index 38b4c2fca2bdb945d08f2ab6e285bd592b5711f6..75a672f9cfa3abe0fd2b6fdf5ab65c37b173b257 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/IXxlJobInfoDao.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/IXxlJobInfoDao.java @@ -23,4 +23,7 @@ public interface IXxlJobInfoDao { public int delete(int id); public List getJobsByGroup(String jobGroup); + + public int findAllCount(); + } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/IXxlJobLogDao.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/IXxlJobLogDao.java index e3c9f48e441d3932280f8b3b6354df791ee437a4..302b1fa581ce4049f278808683b3ef9358cf75d7 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/IXxlJobLogDao.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/IXxlJobLogDao.java @@ -23,5 +23,7 @@ public interface IXxlJobLogDao { public int updateHandleInfo(XxlJobLog xxlJobLog); public int delete(int jobId); - + + public int findByHandleCodeCount(int handleCode); + } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/impl/XxlJobInfoDaoImpl.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/impl/XxlJobInfoDaoImpl.java index 94f288e5bd0a9418ebecd90158beba5b2044bd59..6b211da2f3a076661b85be219f06f93d8e0f62b6 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/impl/XxlJobInfoDaoImpl.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/impl/XxlJobInfoDaoImpl.java @@ -66,4 +66,9 @@ public class XxlJobInfoDaoImpl implements IXxlJobInfoDao { return sqlSessionTemplate.selectList("XxlJobInfoMapper.getJobsByGroup", jobGroup); } + @Override + public int findAllCount() { + return sqlSessionTemplate.selectOne("XxlJobInfoMapper.findAllCount"); + } + } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/impl/XxlJobLogDaoImpl.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/impl/XxlJobLogDaoImpl.java index 510b566371458d1d7c4b65eecedd7354d04f9962..d78d6cab3246ff7779ecd43327d4d5770a243e91 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/impl/XxlJobLogDaoImpl.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/impl/XxlJobLogDaoImpl.java @@ -76,5 +76,10 @@ public class XxlJobLogDaoImpl implements IXxlJobLogDao { public int delete(int jobId) { return sqlSessionTemplate.delete("XxlJobLogMapper.delete", jobId); } - + + @Override + public int findByHandleCodeCount(int handleCode) { + return sqlSessionTemplate.selectOne("XxlJobLogMapper.findByHandleCodeCount", handleCode); + } + } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/service/IXxlJobService.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/service/IXxlJobService.java index 8fc521bd17dc63042614f4fe635bdd0ec97293bd..31829b92ee8d35c01896e578b7ebc47c69dbe0b8 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/service/IXxlJobService.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/service/IXxlJobService.java @@ -26,5 +26,6 @@ public interface IXxlJobService { public ReturnT resume(int id); public ReturnT triggerJob(int id); - + + Map dashboardInfo(); } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java index f86a13291e61b2935dbf33e66aa62fb139007773..04244cef84b7a5c78d850f429f0e647052b999ff 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java @@ -4,12 +4,12 @@ import com.xxl.job.admin.core.model.XxlJobGroup; import com.xxl.job.admin.core.model.XxlJobInfo; import com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum; import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler; -import com.xxl.job.admin.dao.IXxlJobGroupDao; -import com.xxl.job.admin.dao.IXxlJobInfoDao; -import com.xxl.job.admin.dao.IXxlJobLogDao; -import com.xxl.job.admin.dao.IXxlJobLogGlueDao; +import com.xxl.job.admin.core.thread.JobRegistryHelper; +import com.xxl.job.admin.dao.*; import com.xxl.job.admin.service.IXxlJobService; import com.xxl.job.core.biz.model.ReturnT; +import com.xxl.job.core.registry.RegistHelper; +import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.quartz.CronExpression; import org.quartz.SchedulerException; @@ -19,9 +19,7 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.text.MessageFormat; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; /** * core job action for xxl-job @@ -257,5 +255,40 @@ public class XxlJobServiceImpl implements IXxlJobService { return ReturnT.FAIL; } } - + + @Override + public Map dashboardInfo() { + + int jobInfoCount = xxlJobInfoDao.findAllCount(); + int jobLogCount = xxlJobLogDao.findByHandleCodeCount(-1); + int jobLogSuccessCount = xxlJobLogDao.findByHandleCodeCount(ReturnT.SUCCESS_CODE); + + // executor count + Set executerAddressSet = new HashSet(); + List groupList = xxlJobGroupDao.findAll(); + if (CollectionUtils.isNotEmpty(groupList)) { + for (XxlJobGroup group: groupList) { + List registryList = null; + if (group.getAddressType() == 0) { + registryList = JobRegistryHelper.discover(RegistHelper.RegistType.EXECUTOR.name(), group.getAppName()); + } else { + if (StringUtils.isNotBlank(group.getAddressList())) { + registryList = Arrays.asList(group.getAddressList().split(",")); + } + } + if (CollectionUtils.isNotEmpty(registryList)) { + executerAddressSet.addAll(registryList); + } + } + } + int executorCount = executerAddressSet.size(); + + Map dashboardMap = new HashMap(); + dashboardMap.put("jobInfoCount", jobInfoCount); + dashboardMap.put("jobLogCount", jobLogCount); + dashboardMap.put("jobLogSuccessCount", jobLogSuccessCount); + dashboardMap.put("executorCount", executorCount); + return dashboardMap; + } + } diff --git a/xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml b/xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml index cfb5a877f68a2f44f1eeadaee4b2b02e941c83f1..2555de5cf20bc3f782b5a75f22cf3fc52a08ba0f 100644 --- a/xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml +++ b/xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml @@ -151,5 +151,10 @@ FROM XXL_JOB_QRTZ_TRIGGER_INFO AS t WHERE t.job_group = #{jobGroup} - + + + \ No newline at end of file diff --git a/xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogMapper.xml b/xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogMapper.xml index 240ed27459a43736c81a8e4286857b7b441c1b86..6e800d122b971317a76b544c3d25706a08302933 100644 --- a/xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogMapper.xml +++ b/xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogMapper.xml @@ -123,5 +123,15 @@ delete from XXL_JOB_QRTZ_TRIGGER_LOG WHERE job_id = #{jobId} + + \ No newline at end of file diff --git a/xxl-job-admin/src/main/webapp/WEB-INF/template/common/common.macro.ftl b/xxl-job-admin/src/main/webapp/WEB-INF/template/common/common.macro.ftl index 1d55963f0808575793944ab92f765693fcfc3140..f71d02c0e09e808fb29deea0d795306d976f8f11 100644 --- a/xxl-job-admin/src/main/webapp/WEB-INF/template/common/common.macro.ftl +++ b/xxl-job-admin/src/main/webapp/WEB-INF/template/common/common.macro.ftl @@ -81,10 +81,10 @@ diff --git a/xxl-job-admin/src/main/webapp/WEB-INF/template/index.ftl b/xxl-job-admin/src/main/webapp/WEB-INF/template/index.ftl new file mode 100644 index 0000000000000000000000000000000000000000..0a1d75ec873d4772d35771e4c068d0f085cc7b02 --- /dev/null +++ b/xxl-job-admin/src/main/webapp/WEB-INF/template/index.ftl @@ -0,0 +1,100 @@ + + + + 任务调度中心 + <#import "/common/common.macro.ftl" as netCommon> + <@netCommon.commonStyle /> + +sidebar-collapse "> +
+ + <@netCommon.commonHeader /> + + <@netCommon.commonLeft "index" /> + + +
+ +
+

仪表盘任务调度中心

+ +
+ + +
+ + +
+ + <#-- 任务信息 --> +
+
+ + +
+ 任务数量 + ${jobInfoCount} + +
+
+
+ 系统中配置的任务数量 +
+
+
+ + <#-- 调度信息 --> +
+
+ + +
+ 调度次数 + ${jobLogCount} + +
+
+
+ + 调度成功率:${(jobLogSuccessCount*100/jobLogCount)?string("0.00")}% + +
+
+
+ + <#-- 执行器 --> +
+
+ + +
+ 执行器数量 + ${executorCount} + +
+
+
+ 心跳检测成功的执行器机器数量 +
+
+
+ +
+ + +
+ +
+ + + + <@netCommon.commonFooter /> +
+<@netCommon.commonScript /> + + diff --git a/xxl-job-admin/src/main/webapp/WEB-INF/template/jobinfo/jobinfo.index.ftl b/xxl-job-admin/src/main/webapp/WEB-INF/template/jobinfo/jobinfo.index.ftl index f96c8a7c4980259ece7f3f4a6b7b007dafad7875..8582138184830dca32c17e5a239a9ebae08d91d5 100644 --- a/xxl-job-admin/src/main/webapp/WEB-INF/template/jobinfo/jobinfo.index.ftl +++ b/xxl-job-admin/src/main/webapp/WEB-INF/template/jobinfo/jobinfo.index.ftl @@ -25,7 +25,7 @@
-

调度管理任务调度中心

+

任务管理任务调度中心