feat:任务框架

This commit is contained in:
Xiang
2026-01-14 15:07:57 +08:00
parent ca95c335df
commit 720f67f30d
9 changed files with 76 additions and 22 deletions

View File

@@ -46,7 +46,7 @@
<dependency> <dependency>
<groupId>com.xiang.starter</groupId> <groupId>com.xiang.starter</groupId>
<artifactId>xmc-logger-starter</artifactId> <artifactId>xmc-logger-starter</artifactId>
<version>1.0</version> <version>1.1</version>
</dependency> </dependency>
</dependencies> </dependencies>

View File

@@ -4,6 +4,8 @@ import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import javax.validation.constraints.NotBlank;
/** /**
* @Author: xiang * @Author: xiang
* @Date: 2026-01-05 15:49 * @Date: 2026-01-05 15:49
@@ -16,11 +18,13 @@ public class TaskRegisterRequest {
/** /**
* 应用名称 * 应用名称
*/ */
@NotBlank(message = "应用名称不能为空")
private String applicationName; private String applicationName;
/** /**
* 应用地址 * 应用地址
*/ */
@NotBlank(message = "应用地址不能为空")
private String applicationAddress; private String applicationAddress;
/** /**

View File

@@ -5,6 +5,7 @@ import com.xiang.app.quartz.admin.service.ITaskConfigService;
import com.xiang.xservice.basic.common.resp.Result; import com.xiang.xservice.basic.common.resp.Result;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@@ -26,13 +27,13 @@ public class XxzJobRegisterController {
private final ITaskConfigService taskConfigService; private final ITaskConfigService taskConfigService;
@PostMapping("/single") @PostMapping("/single")
public Result<Void> registerSingle(@NotNull(message = "单个注册") @Valid TaskRegisterRequest request){ public Result<Void> registerSingle(@RequestBody @Valid @NotNull(message = "请求参数不能为空") TaskRegisterRequest request){
taskConfigService.registerTask(request); taskConfigService.registerTask(request);
return Result.success(); return Result.success();
} }
@PostMapping("/batch") @PostMapping("/batch")
public Result<Void> batch(@NotEmpty(message = "请求参数不能为空") @Valid List<TaskRegisterRequest> request) { public Result<Void> batch(@RequestBody @NotEmpty(message = "请求参数不能为空") @Valid List<TaskRegisterRequest> request) {
taskConfigService.registerTasks(request); taskConfigService.registerTasks(request);
return Result.success(); return Result.success();
} }

View File

@@ -14,6 +14,7 @@ import org.springframework.stereotype.Service;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects;
import java.util.function.Function; import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -102,6 +103,6 @@ public class TaskConfigServiceImpl implements ITaskConfigService {
jobConfigDO.setCron(item.getCron()); jobConfigDO.setCron(item.getCron());
jobConfigDO.setClazz(item.getClazz()); jobConfigDO.setClazz(item.getClazz());
jobConfigDO.setMethod(item.getMethod()); jobConfigDO.setMethod(item.getMethod());
jobConfigDO.setJobSwitch(0); jobConfigDO.setJobSwitch(Objects.isNull(jobConfigDO.getJobSwitch()) ? 0 : jobConfigDO.getJobSwitch());
} }
} }

View File

@@ -28,7 +28,7 @@
<dependency> <dependency>
<groupId>com.xiang.starter</groupId> <groupId>com.xiang.starter</groupId>
<artifactId>xmc-http-starter</artifactId> <artifactId>xmc-http-starter</artifactId>
<version>1.0</version> <version>2.0-SNAPSHOT</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.xiang.starter</groupId> <groupId>com.xiang.starter</groupId>

View File

@@ -14,5 +14,5 @@ public interface AdminJobClient {
List<JobConfigDO> fetchJobByAppName(String appName); List<JobConfigDO> fetchJobByAppName(String appName);
List<JobConfigDO> fetchJobByAppNameAndVersion(String appName, Integer version); List<JobConfigDO> fetchJobByAppNameAndVersion(String appName, Integer version);
void registerJob(JobDefinition jobDefinition); void registerJob(JobDefinition jobDefinition, String className);
} }

View File

@@ -6,13 +6,14 @@ import com.google.common.collect.Lists;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.xiang.core.quartz.model.JobConfigDO; import com.xiang.core.quartz.model.JobConfigDO;
import com.xiang.core.quartz.model.JobDefinition; import com.xiang.core.quartz.model.JobDefinition;
import com.xiang.core.quartz.model.TaskRegisterRequest;
import com.xiang.core.quartz.model.XxzJobProperties; import com.xiang.core.quartz.model.XxzJobProperties;
import com.xiang.xmc.service.http.helper.HttpHelper; import com.xiang.xmc.service.http.helper.BaseHttpHelp;
import com.xiang.xmc.service.http.helper.HttpHelperFactory;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
@@ -26,13 +27,15 @@ import java.util.Objects;
public class HttpAdminJobClientImpl implements AdminJobClient { public class HttpAdminJobClientImpl implements AdminJobClient {
private final XxzJobProperties xxzJobProperties; private final XxzJobProperties xxzJobProperties;
private static final BaseHttpHelp httpHelp = HttpHelperFactory.createQuartzHttp();
@Override @Override
public List<JobConfigDO> fetchJobByAppName(String appName) { public List<JobConfigDO> fetchJobByAppName(String appName) {
String address = xxzJobProperties.getAdminAddress(); String address = xxzJobProperties.getAdminAddress();
address = address + "/open/quartz/fetch/list"; address = address + "/open/quartz/fetch/list";
Map<String, String> params = Maps.newHashMap(); Map<String, String> params = Maps.newHashMap();
params.put("appName", appName); params.put("appName", appName);
String resp = HttpHelper.doGet(address, null, params); String resp = httpHelp.doGet(address, params);
if (StringUtils.isNotBlank(resp)) { if (StringUtils.isNotBlank(resp)) {
JSONObject jsonObject = JSON.parseObject(resp); JSONObject jsonObject = JSON.parseObject(resp);
if (Objects.nonNull(jsonObject)) { if (Objects.nonNull(jsonObject)) {
@@ -52,7 +55,7 @@ public class HttpAdminJobClientImpl implements AdminJobClient {
Map<String, String> params = Maps.newHashMap(); Map<String, String> params = Maps.newHashMap();
params.put("appName", appName); params.put("appName", appName);
params.put("currVersion", String.valueOf(version)); params.put("currVersion", String.valueOf(version));
String resp = HttpHelper.doGet(address, null, params); String resp = httpHelp.doGet(address, params);
if (StringUtils.isNotBlank(resp)) { if (StringUtils.isNotBlank(resp)) {
JSONObject jsonObject = JSON.parseObject(resp); JSONObject jsonObject = JSON.parseObject(resp);
@@ -67,16 +70,16 @@ public class HttpAdminJobClientImpl implements AdminJobClient {
} }
@Override @Override
public void registerJob(JobDefinition jobDefinition) { public void registerJob(JobDefinition jobDefinition, String className) {
JobConfigDO jobConfigDO = new JobConfigDO(); TaskRegisterRequest request = new TaskRegisterRequest();
jobConfigDO.setApplicationName(xxzJobProperties.getAppName()); request.setApplicationName(xxzJobProperties.getAppName());
jobConfigDO.setApplicationAddress(xxzJobProperties.getAdminAddress()); request.setApplicationAddress(xxzJobProperties.getAdminAddress());
jobConfigDO.setBeanName(jobDefinition.getName()); request.setBeanName(jobDefinition.getName());
jobConfigDO.setClazz(jobConfigDO.getClazz()); request.setCron(jobDefinition.getCron());
jobConfigDO.setMethod(jobConfigDO.getMethod()); request.setClazz(className);
jobConfigDO.setCreateTime(LocalDateTime.now()); request.setMethod(jobDefinition.getMethod().getName());
jobConfigDO.setUpdateTime(LocalDateTime.now()); String address = xxzJobProperties.getAdminAddress();
address = address + "/open/quartz/register/single";
httpHelp.doPost(address, JSON.toJSONString(request));
} }
} }

View File

@@ -0,0 +1,45 @@
package com.xiang.core.quartz.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Author: xiang
* @Date: 2026-01-05 15:49
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TaskRegisterRequest {
/**
* 应用名称
*/
private String applicationName;
/**
* 应用地址
*/
private String applicationAddress;
/**
* 定时任务名称
*/
private String beanName;
/**
* 任务执行调度时间
*/
private String cron;
/**
* 类名
*/
private String clazz;
/**
* 方法
*/
private String method;
}

View File

@@ -54,7 +54,7 @@ public class JobScanner implements SmartInitializingSingleton {
job.setBean(bean); job.setBean(bean);
job.setMethod(method); job.setMethod(method);
JobDefinitionHolder.register(job); JobDefinitionHolder.register(job);
adminJobClient.registerJob(job); adminJobClient.registerJob(job, method.getClass().getName());
} }
} }
} }