diff --git a/doc/db/tables_xxl_job.sql b/doc/db/tables_xxl_job.sql index 33dbb0c1..845370c7 100644 --- a/doc/db/tables_xxl_job.sql +++ b/doc/db/tables_xxl_job.sql @@ -12,6 +12,7 @@ CREATE TABLE `xxl_job_info` ( `job_group` int(11) NOT NULL COMMENT '执行器主键ID', `job_desc` varchar(255) NOT NULL, `add_time` datetime DEFAULT NULL, + `version` varchar(128) default null comment '标签', `update_time` datetime DEFAULT NULL, `author` varchar(64) DEFAULT NULL COMMENT '作者', `alarm_email` varchar(255) DEFAULT NULL COMMENT '报警邮件', @@ -80,6 +81,7 @@ CREATE TABLE `xxl_job_logglue` ( CREATE TABLE `xxl_job_registry` ( `id` int(11) NOT NULL AUTO_INCREMENT, + `registry_version` varchar(128) default null comment '标签', `registry_group` varchar(50) NOT NULL, `registry_key` varchar(255) NOT NULL, `registry_value` varchar(255) NOT NULL, diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java index ea314b32..1ec12f79 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java @@ -4,6 +4,7 @@ import com.xxl.job.admin.core.cron.CronExpression; import com.xxl.job.admin.core.exception.XxlJobException; import com.xxl.job.admin.core.model.XxlJobGroup; import com.xxl.job.admin.core.model.XxlJobInfo; +import com.xxl.job.admin.core.model.XxlJobRegistry; import com.xxl.job.admin.core.model.XxlJobUser; import com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum; import com.xxl.job.admin.core.scheduler.MisfireStrategyEnum; @@ -13,12 +14,14 @@ import com.xxl.job.admin.core.thread.JobTriggerPoolHelper; import com.xxl.job.admin.core.trigger.TriggerTypeEnum; import com.xxl.job.admin.core.util.I18nUtil; import com.xxl.job.admin.dao.XxlJobGroupDao; +import com.xxl.job.admin.dao.XxlJobRegistryDao; import com.xxl.job.admin.service.LoginService; import com.xxl.job.admin.service.XxlJobService; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.enums.ExecutorBlockStrategyEnum; import com.xxl.job.core.glue.GlueTypeEnum; import com.xxl.job.core.util.DateUtil; +import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; @@ -45,6 +48,8 @@ public class JobInfoController { private XxlJobGroupDao xxlJobGroupDao; @Resource private XxlJobService xxlJobService; + @Resource + XxlJobRegistryDao xxlJobRegistryDao; @RequestMapping public String index(HttpServletRequest request, Model model, @RequestParam(required = false, defaultValue = "-1") int jobGroup) { @@ -64,6 +69,28 @@ public class JobInfoController { if (jobGroupList==null || jobGroupList.size()==0) { throw new XxlJobException(I18nUtil.getString("jobgroup_empty")); } + if (jobGroup==-1){ + jobGroup=jobGroupList.get(0).getId(); + } + List list=new ArrayList<>(); + for (XxlJobGroup group : jobGroupList) { + if (group.getId()==jobGroup){ + if (group.getAddressList()!=null){ + String[] split = group.getAddressList().split(","); + if (split.length>0){ + list=new ArrayList(Arrays.asList(split)) ; + } + } + } + } + + if (list.size()>0) { + List registryList = xxlJobRegistryDao + .findByGroup(jobGroup, list); + List distinct = registryList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(o -> o.getRegistryValue() + ";" + o.getRegistryVersion()))), ArrayList::new)); + model.addAttribute("registryList",distinct); + } + //这里可以去重,必要不大 model.addAttribute("JobGroupList", jobGroupList); model.addAttribute("jobGroup", jobGroup); @@ -140,13 +167,13 @@ public class JobInfoController { @RequestMapping("/trigger") @ResponseBody //@PermissionLimit(limit = false) - public ReturnT triggerJob(int id, String executorParam, String addressList) { + public ReturnT triggerJob(int id, String executorParam, String addressList,String version) { // force cover job param if (executorParam == null) { executorParam = ""; } - JobTriggerPoolHelper.trigger(id, TriggerTypeEnum.MANUAL, -1, null, executorParam, addressList); + JobTriggerPoolHelper.trigger(id, TriggerTypeEnum.MANUAL, -1, null, executorParam, addressList,version); return ReturnT.SUCCESS; } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/complete/XxlJobCompleter.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/complete/XxlJobCompleter.java index 279ad7d1..d2be17bb 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/complete/XxlJobCompleter.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/complete/XxlJobCompleter.java @@ -57,7 +57,7 @@ public class XxlJobCompleter { int childJobId = (childJobIds[i]!=null && childJobIds[i].trim().length()>0 && isNumeric(childJobIds[i]))?Integer.valueOf(childJobIds[i]):-1; if (childJobId > 0) { - JobTriggerPoolHelper.trigger(childJobId, TriggerTypeEnum.PARENT, -1, null, null, null); + JobTriggerPoolHelper.trigger(childJobId, TriggerTypeEnum.PARENT, -1, null, null, null,null); ReturnT triggerChildResult = ReturnT.SUCCESS; // add msg diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobInfo.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobInfo.java index e47b6dc6..ed429b64 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobInfo.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobInfo.java @@ -14,6 +14,8 @@ public class XxlJobInfo { private int jobGroup; // 执行器主键ID private String jobDesc; + private String version; + private Date addTime; private Date updateTime; @@ -66,7 +68,15 @@ public class XxlJobInfo { public void setJobDesc(String jobDesc) { this.jobDesc = jobDesc; } - + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + public Date getAddTime() { return addTime; } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobRegistry.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobRegistry.java index 924d6d33..6983f04c 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobRegistry.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobRegistry.java @@ -9,6 +9,7 @@ public class XxlJobRegistry { private int id; private String registryGroup; + private String registryVersion; private String registryKey; private String registryValue; private Date updateTime; @@ -24,7 +25,15 @@ public class XxlJobRegistry { public String getRegistryGroup() { return registryGroup; } - + + public String getRegistryVersion() { + return registryVersion; + } + + public void setRegistryVersion(String registryVersion) { + this.registryVersion = registryVersion; + } + public void setRegistryGroup(String registryGroup) { this.registryGroup = registryGroup; } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java index 8409d7b3..5253d2b6 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java @@ -52,7 +52,7 @@ public class JobFailMonitorHelper { // 1、fail retry monitor if (log.getExecutorFailRetryCount() > 0) { - JobTriggerPoolHelper.trigger(log.getJobId(), TriggerTypeEnum.RETRY, (log.getExecutorFailRetryCount()-1), log.getExecutorShardingParam(), log.getExecutorParam(), null); + JobTriggerPoolHelper.trigger(log.getJobId(), TriggerTypeEnum.RETRY, (log.getExecutorFailRetryCount()-1), log.getExecutorShardingParam(), log.getExecutorParam(), null,null); String retryMsg = "

>>>>>>>>>>>"+ I18nUtil.getString("jobconf_trigger_type_retry") +"<<<<<<<<<<<
"; log.setTriggerMsg(log.getTriggerMsg() + retryMsg); XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().updateTriggerInfo(log); diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryHelper.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryHelper.java index 37edfd98..6a9ca5a7 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryHelper.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryHelper.java @@ -159,9 +159,9 @@ public class JobRegistryHelper { registryOrRemoveThreadPool.execute(new Runnable() { @Override public void run() { - int ret = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().registryUpdate(registryParam.getRegistryGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue(), new Date()); + int ret = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().registryUpdate(registryParam.getRegistryGroup(),registryParam.getRegistryVersion(), registryParam.getRegistryKey(), registryParam.getRegistryValue(), new Date()); if (ret < 1) { - XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().registrySave(registryParam.getRegistryGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue(), new Date()); + XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().registrySave(registryParam.getRegistryGroup(),registryParam.getRegistryVersion(), registryParam.getRegistryKey(), registryParam.getRegistryValue(), new Date()); // fresh freshGroupRegistryInfo(registryParam); diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobScheduleHelper.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobScheduleHelper.java index 831bcf6a..b482ef47 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobScheduleHelper.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobScheduleHelper.java @@ -91,7 +91,7 @@ public class JobScheduleHelper { MisfireStrategyEnum misfireStrategyEnum = MisfireStrategyEnum.match(jobInfo.getMisfireStrategy(), MisfireStrategyEnum.DO_NOTHING); if (MisfireStrategyEnum.FIRE_ONCE_NOW == misfireStrategyEnum) { // FIRE_ONCE_NOW 》 trigger - JobTriggerPoolHelper.trigger(jobInfo.getId(), TriggerTypeEnum.MISFIRE, -1, null, null, null); + JobTriggerPoolHelper.trigger(jobInfo.getId(), TriggerTypeEnum.MISFIRE, -1, null, null, null,null); logger.debug(">>>>>>>>>>> xxl-job, schedule push trigger : jobId = " + jobInfo.getId() ); } @@ -102,7 +102,7 @@ public class JobScheduleHelper { // 2.2、trigger-expire < 5s:direct-trigger && make next-trigger-time // 1、trigger - JobTriggerPoolHelper.trigger(jobInfo.getId(), TriggerTypeEnum.CRON, -1, null, null, null); + JobTriggerPoolHelper.trigger(jobInfo.getId(), TriggerTypeEnum.CRON, -1, null, null, null,null); logger.debug(">>>>>>>>>>> xxl-job, schedule push trigger : jobId = " + jobInfo.getId() ); // 2、fresh next @@ -250,7 +250,7 @@ public class JobScheduleHelper { // do trigger for (int jobId: ringItemData) { // do trigger - JobTriggerPoolHelper.trigger(jobId, TriggerTypeEnum.CRON, -1, null, null, null); + JobTriggerPoolHelper.trigger(jobId, TriggerTypeEnum.CRON, -1, null, null, null,null); } // clear ringItemData.clear(); diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobTriggerPoolHelper.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobTriggerPoolHelper.java index 398713dd..3762fc21 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobTriggerPoolHelper.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobTriggerPoolHelper.java @@ -74,7 +74,7 @@ public class JobTriggerPoolHelper { final int failRetryCount, final String executorShardingParam, final String executorParam, - final String addressList) { + final String addressList,final String version) { // choose thread pool ThreadPoolExecutor triggerPool_ = fastTriggerPool; @@ -92,7 +92,7 @@ public class JobTriggerPoolHelper { try { // do trigger - XxlJobTrigger.trigger(jobId, triggerType, failRetryCount, executorShardingParam, executorParam, addressList); + XxlJobTrigger.trigger(jobId, triggerType, failRetryCount, executorShardingParam, executorParam, addressList,version); } catch (Exception e) { logger.error(e.getMessage(), e); } finally { @@ -143,8 +143,8 @@ public class JobTriggerPoolHelper { * null: use job param * not null: cover job param */ - public static void trigger(int jobId, TriggerTypeEnum triggerType, int failRetryCount, String executorShardingParam, String executorParam, String addressList) { - helper.addTrigger(jobId, triggerType, failRetryCount, executorShardingParam, executorParam, addressList); + public static void trigger(int jobId, TriggerTypeEnum triggerType, int failRetryCount, String executorShardingParam, String executorParam, String addressList,String version) { + helper.addTrigger(jobId, triggerType, failRetryCount, executorShardingParam, executorParam, addressList,version); } } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/VersionEnum.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/VersionEnum.java new file mode 100644 index 00000000..bb246da7 --- /dev/null +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/VersionEnum.java @@ -0,0 +1,20 @@ +package com.xxl.job.admin.core.trigger; + +/** + * @Description TODO + * @Author 姚仲杰#80998699 + * @Date 2022/1/4 16:45 + */ +public enum VersionEnum { + DEFAULT("default"), + MASTER("master"); + + private String version; + VersionEnum(String version){ + this.version=version; + } + public String get(){ + return version; + } + +} diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java index 748befc6..6dbd15ad 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java @@ -4,6 +4,7 @@ import com.xxl.job.admin.core.conf.XxlJobAdminConfig; import com.xxl.job.admin.core.model.XxlJobGroup; import com.xxl.job.admin.core.model.XxlJobInfo; import com.xxl.job.admin.core.model.XxlJobLog; +import com.xxl.job.admin.core.model.XxlJobRegistry; import com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum; import com.xxl.job.admin.core.scheduler.XxlJobScheduler; import com.xxl.job.admin.core.util.I18nUtil; @@ -13,10 +14,13 @@ import com.xxl.job.core.biz.model.TriggerParam; import com.xxl.job.core.enums.ExecutorBlockStrategyEnum; import com.xxl.job.core.util.IpUtil; import com.xxl.job.core.util.ThrowableUtil; +import java.util.ArrayList; +import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Date; +import org.springframework.util.StringUtils; /** * xxl-job trigger @@ -46,7 +50,7 @@ public class XxlJobTrigger { int failRetryCount, String executorShardingParam, String executorParam, - String addressList) { + String addressList,String version) { // load data XxlJobInfo jobInfo = XxlJobAdminConfig.getAdminConfig().getXxlJobInfoDao().loadById(jobId); @@ -57,8 +61,22 @@ public class XxlJobTrigger { if (executorParam != null) { jobInfo.setExecutorParam(executorParam); } + if (version !=null){ + jobInfo.setVersion(version); + } int finalFailRetryCount = failRetryCount>=0?failRetryCount:jobInfo.getExecutorFailRetryCount(); XxlJobGroup group = XxlJobAdminConfig.getAdminConfig().getXxlJobGroupDao().load(jobInfo.getJobGroup()); + //版本过滤 分成手动模式和自动模式,手动模式下取传入参数,自动模式取jobinfo参数,仅executorParam和version + if (!StringUtils.isEmpty(jobInfo.getVersion())&&!VersionEnum.DEFAULT.get().equals(jobInfo.getVersion())) { + List byVersion = XxlJobAdminConfig.getAdminConfig() + .getXxlJobRegistryDao() + .findByVersion(jobInfo.getVersion(), group.getRegistryList()); + List addresses=new ArrayList<>(); + for (XxlJobRegistry xxlJobRegistry : byVersion) { + addresses.add(xxlJobRegistry.getRegistryValue()); + } + group.setAddressList(String.join(",",addresses)); + } // cover addressList if (addressList!=null && addressList.trim().length()>0) { @@ -126,6 +144,7 @@ public class XxlJobTrigger { // 2、init trigger-param TriggerParam triggerParam = new TriggerParam(); triggerParam.setJobId(jobInfo.getId()); + triggerParam.setVersion(jobInfo.getVersion()); triggerParam.setExecutorHandler(jobInfo.getExecutorHandler()); triggerParam.setExecutorParams(jobInfo.getExecutorParam()); triggerParam.setExecutorBlockStrategy(jobInfo.getExecutorBlockStrategy()); diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobRegistryDao.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobRegistryDao.java index 1005c46c..b1b5fd09 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobRegistryDao.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobRegistryDao.java @@ -20,13 +20,17 @@ public interface XxlJobRegistryDao { public List findAll(@Param("timeout") int timeout, @Param("nowTime") Date nowTime); - + + public List findByGroup(@Param("groupId")int id,@Param("list")List list); + public List findByVersion(@Param("registryVersion") String version,@Param("list")List list); public int registryUpdate(@Param("registryGroup") String registryGroup, + @Param("registryVersion") String registryVersion, @Param("registryKey") String registryKey, @Param("registryValue") String registryValue, @Param("updateTime") Date updateTime); public int registrySave(@Param("registryGroup") String registryGroup, + @Param("registryVersion") String registryVersion, @Param("registryKey") String registryKey, @Param("registryValue") String registryValue, @Param("updateTime") Date updateTime); 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 530ee41c..e705528a 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 @@ -266,6 +266,7 @@ public class XxlJobServiceImpl implements XxlJobService { exists_jobInfo.setJobGroup(jobInfo.getJobGroup()); exists_jobInfo.setJobDesc(jobInfo.getJobDesc()); + exists_jobInfo.setVersion(jobInfo.getVersion()); exists_jobInfo.setAuthor(jobInfo.getAuthor()); exists_jobInfo.setAlarmEmail(jobInfo.getAlarmEmail()); exists_jobInfo.setScheduleType(jobInfo.getScheduleType()); diff --git a/xxl-job-admin/src/main/resources/application.properties b/xxl-job-admin/src/main/resources/application.properties index 8727b6c7..fe659657 100644 --- a/xxl-job-admin/src/main/resources/application.properties +++ b/xxl-job-admin/src/main/resources/application.properties @@ -25,7 +25,7 @@ mybatis.mapper-locations=classpath:/mybatis-mapper/*Mapper.xml ### xxl-job, datasource spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai spring.datasource.username=root -spring.datasource.password=root_pwd +spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver ### datasource-pool 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 7b3c3a3e..76dfeef8 100644 --- a/xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml +++ b/xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml @@ -36,6 +36,7 @@ + @@ -62,7 +63,8 @@ t.child_jobid, t.trigger_status, t.trigger_last_time, - t.trigger_next_time + t.trigger_next_time, + t.version ${I18n.jobgroup_field_addressType_0}      - ${I18n.jobgroup_field_addressType_1} +<#-- ${I18n.jobgroup_field_addressType_1}-->
diff --git a/xxl-job-admin/src/main/resources/templates/jobinfo/jobinfo.index.ftl b/xxl-job-admin/src/main/resources/templates/jobinfo/jobinfo.index.ftl index 3a5d7d8a..8ff4f5d4 100644 --- a/xxl-job-admin/src/main/resources/templates/jobinfo/jobinfo.index.ftl +++ b/xxl-job-admin/src/main/resources/templates/jobinfo/jobinfo.index.ftl @@ -190,7 +190,19 @@

${I18n.jobinfo_conf_advanced}

<#-- 高级配置 --> - +
+ +
+ +
+
@@ -435,7 +447,19 @@ exit 0

${I18n.jobinfo_conf_advanced}

<#-- 高级配置 --> - +
+ +
+ +
+
@@ -501,6 +525,19 @@ exit 0