feat:动态获取任务的cron和开关

This commit is contained in:
Xiang
2026-01-06 15:30:26 +08:00
parent 95a590f088
commit 64ca6f4478
14 changed files with 275 additions and 12 deletions

View File

@@ -25,6 +25,11 @@
<artifactId>xmc-common</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>com.xiang.starter</groupId>
<artifactId>xmc-http-starter</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>com.xiang.starter</groupId>
<artifactId>xmc-cache-starter</artifactId>

View File

@@ -22,11 +22,11 @@ public @interface XxzJob {
*/
String name();
/**
* cron调度方法
* @return
*/
String cron();
// /**
// * cron调度方法
// * @return
// */
// String cron();
boolean enabled() default true;
/**

View File

@@ -0,0 +1,14 @@
package com.xiang.core.quartz.api;
import com.xiang.core.quartz.model.JobConfigDO;
import java.util.List;
/**
* @Author: xiang
* @Date: 2026-01-06 15:10
*/
public interface AdminJobClient {
List<JobConfigDO> fetchJobByAppName(String appName);
}

View File

@@ -0,0 +1,45 @@
package com.xiang.core.quartz.api;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.xiang.core.quartz.model.JobConfigDO;
import com.xiang.core.quartz.model.XxzJobProperties;
import com.xiang.xmc.service.http.helper.HttpHelper;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
* @Author: xiang
* @Date: 2026-01-06 15:11
*/
@Component
@RequiredArgsConstructor
public class HttpAdminJobClientImpl implements AdminJobClient{
private final XxzJobProperties xxzJobProperties;
@Override
public List<JobConfigDO> fetchJobByAppName(String appName) {
String address = xxzJobProperties.getAdminAddress();
address = address + "/open/quartz/fetch/list";
Map<String, String> params = Maps.newHashMap();
params.put("appName", appName);
String resp = HttpHelper.doGet(address, null, params);
if (StringUtils.isNotBlank(resp)) {
JSONObject jsonObject = JSON.parseObject(resp);
if (Objects.nonNull(jsonObject)) {
String data = JSON.toJSONString(jsonObject.get("data"));
if (StringUtils.isNotBlank(data)) {
return JSON.parseArray(data, JobConfigDO.class);
}
}
}
return Lists.newArrayList();
}
}

View File

@@ -1,14 +1,22 @@
package com.xiang.core.quartz.boostrap;
import com.xiang.core.quartz.api.AdminJobClient;
import com.xiang.core.quartz.holder.JobDefinitionHolder;
import com.xiang.core.quartz.model.JobDefinition;
import com.xiang.core.quartz.model.JobConfigDO;
import com.xiang.core.quartz.model.XxzJobProperties;
import com.xiang.core.quartz.schedule.JobScheduler;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* @Author: xiang
* @Date: 2026-01-06 09:50
@@ -19,13 +27,29 @@ public class JobBootstrap implements ApplicationRunner {
@Autowired
private JobScheduler scheduler;
@Autowired
private AdminJobClient adminJobClient;
@Autowired
private XxzJobProperties xxzJobProperties;
@Override
public void run(ApplicationArguments args) {
List<JobConfigDO> jobConfigDOS = adminJobClient.fetchJobByAppName(xxzJobProperties.getAppName());
if (CollectionUtils.isEmpty(jobConfigDOS)) {
return;
}
Map<String, JobConfigDO> map = jobConfigDOS.stream().collect(Collectors.toMap(JobConfigDO::getBeanName, Function.identity(), (a, b) -> a));
JobDefinitionHolder.getAll()
.stream()
.filter(JobDefinition::isEnabled)
.forEach(scheduler::schedule);
.forEach(item -> {
if (map.containsKey(item.getName())) {
JobConfigDO jobConfigDO = map.get(item.getName());
if (jobConfigDO.getJobSwitch() == 1) {
item.setCron(jobConfigDO.getCron());
item.setEnabled(jobConfigDO.getJobSwitch() == 1);
scheduler.schedule(item);
}
}
});
}
}

View File

@@ -0,0 +1,84 @@
package com.xiang.core.quartz.model;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* @Author: xiang
* @Date: 2025-12-30 09:42
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("xmc_quartz_config")
public class JobConfigDO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* id
*/
private Long id;
/**
* 应用名称
*/
private String applicationName;
/**
* 应用地址
*/
private String applicationAddress;
/**
* 定时任务名称
*/
private String beanName;
/**
* 任务执行调度时间
*/
private String cron;
/**
* 类名
*/
private String clazz;
/**
* 方法
*/
private String method;
/**
* 任务开关
* 0:关闭 1:开启
*/
private Integer jobSwitch;
/**
* 删除标识0:未删除 1:已删除)
*/
private Integer delFlag;
/**
* 创建时间
*/
private LocalDateTime createTime;
/**
* 修改时间
*/
private LocalDateTime updateTime;
/**
* 上次执行时间
*/
private LocalDateTime lastRunningTime;
}

View File

@@ -20,4 +20,9 @@ public class XxzJobProperties {
* DB刷新任务间隔毫秒
*/
private int refreshInterval = 5000;
/**
* 调度中心地址
*/
private String adminAddress;
}

View File

@@ -50,8 +50,8 @@ public class JobScanner implements SmartInitializingSingleton {
job.setDistributed(xxzJob.distributed());
job.setBean(bean);
job.setMethod(method);
job.setEnabled(xxzJob.enabled());
job.setCron(xxzJob.cron());
// job.setEnabled();
// job.setCron(xxzJob.cron());
JobDefinitionHolder.register(job);
}
}