├── src └── main │ ├── resources │ └── META-INF │ │ └── spring │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ └── java │ └── com │ └── xiaogang │ └── xxljobadminsdk │ ├── vo │ ├── JobGroupPageResult.java │ ├── JobInfoPageResult.java │ ├── DataItem.java │ └── JobInfoPageItem.java │ ├── constants │ ├── MisfireStrategyEnum.java │ ├── ScheduleTypeEnum.java │ ├── ExecutorBlockStrategyEnum.java │ ├── GlueTypeEnum.java │ ├── ExecutorRouteStrategyEnum.java │ └── TriggerStatusEnum.java │ ├── dto │ ├── HttpHeader.java │ ├── JobGroupQuery.java │ ├── JobQuery.java │ └── ReturnT.java │ ├── utils │ └── MyUtil.java │ ├── model │ ├── XxlJobInfoAddParam.java │ ├── DefaultXxlJobAddParam.java │ ├── XxlJobInfo.java │ └── JobUpdateParam.java │ ├── config │ ├── XxlJobAdminProperties.java │ └── XxlJobAdminAutoConfigure.java │ └── service │ ├── XxlJobService.java │ └── impl │ └── XxlJobServiceImpl.java ├── .gitignore ├── README.md └── pom.xml /src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports: -------------------------------------------------------------------------------- 1 | com.xiaogang.xxljobadminsdk.config.XxlJobAdminAutoConfigure -------------------------------------------------------------------------------- /src/main/java/com/xiaogang/xxljobadminsdk/vo/JobGroupPageResult.java: -------------------------------------------------------------------------------- 1 | package com.xiaogang.xxljobadminsdk.vo; 2 | 3 | import lombok.Data; 4 | 5 | import java.io.Serializable; 6 | import java.util.List; 7 | 8 | @Data 9 | public class JobGroupPageResult implements Serializable { 10 | 11 | private int recordsFiltered; 12 | 13 | private List data; 14 | 15 | private int recordsTotal; 16 | } -------------------------------------------------------------------------------- /src/main/java/com/xiaogang/xxljobadminsdk/constants/MisfireStrategyEnum.java: -------------------------------------------------------------------------------- 1 | package com.xiaogang.xxljobadminsdk.constants; 2 | 3 | import lombok.Getter; 4 | 5 | /** 6 | * @author: xiaogang 7 | */ 8 | @Getter 9 | public enum MisfireStrategyEnum { 10 | DO_NOTHING("忽略"), 11 | FIRE_ONCE_NOW("立即执行一次") 12 | ; 13 | private String remark; 14 | 15 | MisfireStrategyEnum(String remark) { 16 | this.remark = remark; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/xiaogang/xxljobadminsdk/constants/ScheduleTypeEnum.java: -------------------------------------------------------------------------------- 1 | package com.xiaogang.xxljobadminsdk.constants; 2 | 3 | import lombok.Getter; 4 | 5 | /** 6 | * @author: xiaogang 7 | */ 8 | @Getter 9 | public enum ScheduleTypeEnum { 10 | NONE("无"), 11 | CRON("CRON"), 12 | FIX_RATE("固定速度") 13 | ; 14 | private String remark; 15 | 16 | ScheduleTypeEnum(String remark) { 17 | this.remark = remark; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/xiaogang/xxljobadminsdk/vo/JobInfoPageResult.java: -------------------------------------------------------------------------------- 1 | package com.xiaogang.xxljobadminsdk.vo; 2 | 3 | import lombok.Data; 4 | 5 | import java.io.Serializable; 6 | import java.util.List; 7 | 8 | public @Data class JobInfoPageResult implements Serializable { 9 | private static final long serialVersionUID = 1316450425048690593L; 10 | 11 | private int recordsFiltered; 12 | private List data; 13 | private int recordsTotal; 14 | } -------------------------------------------------------------------------------- /src/main/java/com/xiaogang/xxljobadminsdk/constants/ExecutorBlockStrategyEnum.java: -------------------------------------------------------------------------------- 1 | package com.xiaogang.xxljobadminsdk.constants; 2 | 3 | import lombok.Getter; 4 | 5 | /** 6 | * @author: xiaogang 7 | */ 8 | @Getter 9 | public enum ExecutorBlockStrategyEnum { 10 | SERIAL_EXECUTION("单机串行"), 11 | DISCARD_LATER("丢弃后续调度"), 12 | COVER_EARLY("覆盖之前调度") 13 | ; 14 | private String remark; 15 | 16 | ExecutorBlockStrategyEnum(String remark) { 17 | this.remark = remark; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/xiaogang/xxljobadminsdk/vo/DataItem.java: -------------------------------------------------------------------------------- 1 | package com.xiaogang.xxljobadminsdk.vo; 2 | 3 | import lombok.Data; 4 | 5 | import java.io.Serializable; 6 | import java.util.List; 7 | 8 | @Data 9 | public class DataItem implements Serializable { 10 | 11 | private int id; 12 | 13 | private String appname; 14 | 15 | private String title; 16 | 17 | private int addressType; 18 | 19 | private String addressList; 20 | 21 | private String updateTime; 22 | 23 | private List registryList; 24 | } -------------------------------------------------------------------------------- /src/main/java/com/xiaogang/xxljobadminsdk/dto/HttpHeader.java: -------------------------------------------------------------------------------- 1 | package com.xiaogang.xxljobadminsdk.dto; 2 | 3 | import lombok.Data; 4 | import lombok.NoArgsConstructor; 5 | 6 | import java.io.Serializable; 7 | 8 | @Data 9 | @NoArgsConstructor 10 | public class HttpHeader implements Serializable { 11 | private String headerName; 12 | private String headerValue; 13 | 14 | public HttpHeader(String headerName, String headerValue) { 15 | this.headerName = headerName; 16 | this.headerValue = headerValue; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | target/ 3 | !.mvn/wrapper/maven-wrapper.jar 4 | !**/src/main/**/target/ 5 | !**/src/test/**/target/ 6 | 7 | ### STS ### 8 | .apt_generated 9 | .classpath 10 | .factorypath 11 | .project 12 | .settings 13 | .springBeans 14 | .sts4-cache 15 | 16 | ### IntelliJ IDEA ### 17 | .idea 18 | *.iws 19 | *.iml 20 | *.ipr 21 | 22 | ### NetBeans ### 23 | /nbproject/private/ 24 | /nbbuild/ 25 | /dist/ 26 | /nbdist/ 27 | /.nb-gradle/ 28 | build/ 29 | !**/src/main/**/build/ 30 | !**/src/test/**/build/ 31 | 32 | ### VS Code ### 33 | .vscode/ 34 | mvnw* 35 | .mvn 36 | test 37 | .idea 38 | easy-delivery -------------------------------------------------------------------------------- /src/main/java/com/xiaogang/xxljobadminsdk/utils/MyUtil.java: -------------------------------------------------------------------------------- 1 | package com.xiaogang.xxljobadminsdk.utils; 2 | 3 | import java.text.SimpleDateFormat; 4 | import java.util.Date; 5 | 6 | public class MyUtil { 7 | private static final String CRON_DATE_FORMAT = "ss mm HH dd MM ? yyyy"; 8 | 9 | public static String getCron(final Date date) { 10 | SimpleDateFormat sdf = new SimpleDateFormat(CRON_DATE_FORMAT); 11 | String formatTimeStr = ""; 12 | if (date != null) { 13 | formatTimeStr = sdf.format(date); 14 | } 15 | return formatTimeStr; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/xiaogang/xxljobadminsdk/constants/GlueTypeEnum.java: -------------------------------------------------------------------------------- 1 | package com.xiaogang.xxljobadminsdk.constants; 2 | 3 | import lombok.Getter; 4 | 5 | /** 6 | * @author: xiaogang 7 | */ 8 | @Getter 9 | public enum GlueTypeEnum { 10 | BEAN("BEAN"), 11 | GLUE_GROOVY("GLUE(Java)"), 12 | GLUE_SHELL("GLUE(Shell)"), 13 | GLUE_PYTHON("GLUE(Python)"), 14 | GLUE_PHP("GLUE(PHP)"), 15 | GLUE_NODEJS("GLUE(Nodejs)"), 16 | GLUE_POWERSHELL("GLUE(PowerShell)"), 17 | ; 18 | private String remark; 19 | 20 | GlueTypeEnum(String remark) { 21 | this.remark = remark; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/xiaogang/xxljobadminsdk/dto/JobGroupQuery.java: -------------------------------------------------------------------------------- 1 | package com.xiaogang.xxljobadminsdk.dto; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | import java.io.Serializable; 9 | 10 | /** 11 | * @author : xiaogang 12 | * Created in 9:47 2023/1/4 13 | */ 14 | @Data 15 | @AllArgsConstructor 16 | @NoArgsConstructor 17 | @Builder 18 | public class JobGroupQuery implements Serializable { 19 | private int start = 0; 20 | private int length = 10; 21 | private String appname; 22 | private String title; 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/xiaogang/xxljobadminsdk/constants/ExecutorRouteStrategyEnum.java: -------------------------------------------------------------------------------- 1 | package com.xiaogang.xxljobadminsdk.constants; 2 | 3 | import lombok.Getter; 4 | 5 | /** 6 | * @author : xiaogang 7 | */ 8 | @Getter 9 | public enum ExecutorRouteStrategyEnum { 10 | FIRST("第一个"), 11 | LAST("最后一个"), 12 | ROUND("轮询"), 13 | RANDOM("随机"), 14 | CONSISTENT_HASH("一致性HASH"), 15 | LEAST_FREQUENTLY_USED("最不经常使用"), 16 | LEAST_RECENTLY_USED("最近最久未使用"), 17 | FAILOVER("故障转移"), 18 | BUSYOVER("忙碌转移"), 19 | SHARDING_BROADCAST("分片广播") 20 | ; 21 | private String remark; 22 | 23 | ExecutorRouteStrategyEnum(String remark) { 24 | this.remark = remark; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/xiaogang/xxljobadminsdk/model/XxlJobInfoAddParam.java: -------------------------------------------------------------------------------- 1 | package com.xiaogang.xxljobadminsdk.model; 2 | 3 | import com.xiaogang.xxljobadminsdk.constants.ScheduleTypeEnum; 4 | import lombok.Data; 5 | 6 | /** 7 | * 添加job的必传参数,其它默认 8 | * @author : xiaogang 9 | */ 10 | @Data 11 | public class XxlJobInfoAddParam { 12 | 13 | protected String jobDesc; 14 | protected String author; // 负责人 15 | protected String alarmEmail; // 报警邮件 16 | 17 | protected ScheduleTypeEnum scheduleType = ScheduleTypeEnum.CRON; // 调度类型 18 | protected String scheduleConf; // 调度配置,值含义取决于调度类型 19 | 20 | protected String executorHandler; // 执行器,任务Handler名称 21 | protected String executorParam; // 执行器,任务参数 22 | 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/xiaogang/xxljobadminsdk/constants/TriggerStatusEnum.java: -------------------------------------------------------------------------------- 1 | package com.xiaogang.xxljobadminsdk.constants; 2 | 3 | import lombok.Getter; 4 | 5 | /** 6 | * @author: xiaogang 7 | */ 8 | @Getter 9 | public enum TriggerStatusEnum { 10 | ALL(-1), 11 | START(1), 12 | STOP(0), 13 | ; 14 | private Integer status; 15 | 16 | TriggerStatusEnum(Integer status) { 17 | this.status = status; 18 | } 19 | 20 | public static TriggerStatusEnum getByStatus(int status){ 21 | if (status == -1) { 22 | return ALL; 23 | }else if (status == 1){ 24 | return START; 25 | }else if (status == 0){ 26 | return STOP; 27 | } 28 | return null; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/xiaogang/xxljobadminsdk/dto/JobQuery.java: -------------------------------------------------------------------------------- 1 | package com.xiaogang.xxljobadminsdk.dto; 2 | 3 | import com.xiaogang.xxljobadminsdk.constants.TriggerStatusEnum; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Data; 7 | import lombok.NoArgsConstructor; 8 | 9 | import java.io.Serializable; 10 | 11 | /** 12 | * @author : xiaogang 13 | * Created in 9:47 2023/1/4 14 | */ 15 | @Data 16 | @AllArgsConstructor 17 | @NoArgsConstructor 18 | @Builder 19 | public class JobQuery implements Serializable { 20 | private int start = 0; 21 | private int length = 10; 22 | private Integer jobGroup; 23 | private TriggerStatusEnum triggerStatus = TriggerStatusEnum.ALL; 24 | private String jobDesc; 25 | private String executorHandler; 26 | private String author; 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/xiaogang/xxljobadminsdk/config/XxlJobAdminProperties.java: -------------------------------------------------------------------------------- 1 | package com.xiaogang.xxljobadminsdk.config; 2 | 3 | import lombok.Data; 4 | import org.springframework.boot.context.properties.ConfigurationProperties; 5 | import org.springframework.context.annotation.Configuration; 6 | 7 | @Data 8 | @ConfigurationProperties(prefix = "xxl.job.sdk") 9 | @Configuration 10 | public class XxlJobAdminProperties { 11 | private String adminUrl = "http://localhost:8080/xxl-job-admin"; 12 | private String userName = "admin"; 13 | private String password = "123456"; 14 | private Integer connectionTimeOut = 5000; 15 | 16 | //执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册 17 | private String appname; 18 | //执行器通讯TOKEN [选填]:非空时启用; 19 | private String accessToken; 20 | //执行器注册 [选填]:优先使用该配置作为注册地址,为空时使用内嵌服务 ”IP:PORT“ 作为注册地址。从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。 21 | private String address; 22 | //执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务"; 23 | private String ip; 24 | //执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口; 25 | private Integer port; 26 | //执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径; 27 | private String logPath; 28 | //执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能; 29 | private Integer logRetentionDays = 30; 30 | 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/xiaogang/xxljobadminsdk/model/DefaultXxlJobAddParam.java: -------------------------------------------------------------------------------- 1 | package com.xiaogang.xxljobadminsdk.model; 2 | 3 | import com.xiaogang.xxljobadminsdk.constants.*; 4 | import lombok.Data; 5 | 6 | /** 7 | * 添加job的必传参数,其它默认。但是可以修改默认参数 8 | * @author: xiaogang 9 | */ 10 | @Data 11 | public class DefaultXxlJobAddParam{ 12 | 13 | protected String jobDesc; 14 | protected String author; // 负责人 15 | protected String alarmEmail; // 报警邮件 16 | 17 | protected ScheduleTypeEnum scheduleType = ScheduleTypeEnum.CRON; // 调度类型 18 | protected String scheduleConf; // 调度配置,值含义取决于调度类型 19 | 20 | protected String executorHandler; // 执行器,任务Handler名称 21 | protected String executorParam; // 执行器,任务参数 22 | 23 | protected GlueTypeEnum glueType = GlueTypeEnum.BEAN; // GLUE类型 #com.xxl.job.core.glue.GlueTypeEnum 24 | protected ExecutorRouteStrategyEnum executorRouteStrategy = ExecutorRouteStrategyEnum.FIRST; // 执行器路由策略 25 | protected String childJobId; // 子任务ID,多个逗号分隔 26 | protected MisfireStrategyEnum misfireStrategy = MisfireStrategyEnum.DO_NOTHING; // 调度过期策略 27 | protected ExecutorBlockStrategyEnum executorBlockStrategy = ExecutorBlockStrategyEnum.SERIAL_EXECUTION; // 阻塞处理策略 28 | protected int executorTimeout = 0; // 任务执行超时时间,单位秒 29 | protected int executorFailRetryCount = 0; // 失败重试次数 30 | protected String glueRemark = "glueRemark"; // GLUE备注 31 | 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/xiaogang/xxljobadminsdk/vo/JobInfoPageItem.java: -------------------------------------------------------------------------------- 1 | package com.xiaogang.xxljobadminsdk.vo; 2 | 3 | import com.xiaogang.xxljobadminsdk.constants.ExecutorBlockStrategyEnum; 4 | import com.xiaogang.xxljobadminsdk.constants.ExecutorRouteStrategyEnum; 5 | import com.xiaogang.xxljobadminsdk.constants.MisfireStrategyEnum; 6 | import com.xiaogang.xxljobadminsdk.constants.ScheduleTypeEnum; 7 | import lombok.Data; 8 | 9 | import java.io.Serializable; 10 | 11 | public @Data class JobInfoPageItem implements Serializable { 12 | private static final long serialVersionUID = -1842102864350831173L; 13 | 14 | private Long triggerLastTime; 15 | private String alarmEmail; 16 | private String glueUpdatetime; 17 | private String executorParam; 18 | private String addTime; 19 | private ExecutorBlockStrategyEnum executorBlockStrategy; 20 | private String author; 21 | private String scheduleConf; 22 | private ExecutorRouteStrategyEnum executorRouteStrategy; 23 | private Long triggerStatus; 24 | private Integer childJobId; 25 | private long triggerNextTime; 26 | private String updateTime; 27 | private int jobGroup; 28 | private String glueRemark; 29 | private String jobDesc; 30 | private String glueSource; 31 | private MisfireStrategyEnum misfireStrategy; 32 | private ScheduleTypeEnum scheduleType; 33 | private String glueType; 34 | private String executorHandler; 35 | private int executorFailRetryCount; 36 | private int id; 37 | private int executorTimeout; 38 | } -------------------------------------------------------------------------------- /src/main/java/com/xiaogang/xxljobadminsdk/dto/ReturnT.java: -------------------------------------------------------------------------------- 1 | package com.xiaogang.xxljobadminsdk.dto; 2 | 3 | import java.io.Serializable; 4 | 5 | public class ReturnT implements Serializable { 6 | public static final long serialVersionUID = 42L; 7 | public static final int SUCCESS_CODE = 200; 8 | public static final int FAIL_CODE = 500; 9 | public static final ReturnT SUCCESS = new ReturnT((Object)null); 10 | public static final ReturnT FAIL = new ReturnT(500, (String)null); 11 | private int code; 12 | private String msg; 13 | private T content; 14 | 15 | public ReturnT() { 16 | } 17 | 18 | public ReturnT(int code, String msg) { 19 | this.code = code; 20 | this.msg = msg; 21 | } 22 | 23 | public ReturnT(T content) { 24 | this.code = 200; 25 | this.content = content; 26 | } 27 | 28 | public int getCode() { 29 | return this.code; 30 | } 31 | 32 | public void setCode(int code) { 33 | this.code = code; 34 | } 35 | 36 | public String getMsg() { 37 | return this.msg; 38 | } 39 | 40 | public void setMsg(String msg) { 41 | this.msg = msg; 42 | } 43 | 44 | public T getContent() { 45 | return this.content; 46 | } 47 | 48 | public void setContent(T content) { 49 | this.content = content; 50 | } 51 | 52 | public String toString() { 53 | return "ReturnT [code=" + this.code + ", msg=" + this.msg + ", content=" + this.content + "]"; 54 | } 55 | } 56 | 57 | -------------------------------------------------------------------------------- /src/main/java/com/xiaogang/xxljobadminsdk/model/XxlJobInfo.java: -------------------------------------------------------------------------------- 1 | package com.xiaogang.xxljobadminsdk.model; 2 | 3 | import com.xiaogang.xxljobadminsdk.constants.*; 4 | import lombok.Data; 5 | 6 | import java.util.Date; 7 | 8 | /** 9 | * 原始添加添加job的所有参数 10 | */ 11 | @Data 12 | public class XxlJobInfo { 13 | 14 | protected int id; // 主键ID 15 | 16 | protected int jobGroup; // 执行器主键ID 17 | protected String jobDesc; 18 | 19 | protected Date addTime; 20 | protected Date updateTime; 21 | 22 | protected String author; // 负责人 23 | protected String alarmEmail; // 报警邮件 24 | 25 | protected ScheduleTypeEnum scheduleType; // 调度类型 26 | protected String scheduleConf; // 调度配置,值含义取决于调度类型 27 | protected MisfireStrategyEnum misfireStrategy; // 调度过期策略 28 | 29 | protected ExecutorRouteStrategyEnum executorRouteStrategy; // 执行器路由策略 30 | protected String executorHandler; // 执行器,任务Handler名称 31 | protected String executorParam; // 执行器,任务参数 32 | protected String executorBlockStrategy; // 阻塞处理策略 33 | protected int executorTimeout; // 任务执行超时时间,单位秒 34 | protected int executorFailRetryCount; // 失败重试次数 35 | 36 | protected GlueTypeEnum glueType; // GLUE类型 #com.xxl.job.core.glue.GlueTypeEnum 37 | protected String glueSource; // GLUE源代码 38 | protected String glueRemark; // GLUE备注 39 | protected Date glueUpdatetime; // GLUE更新时间 40 | 41 | protected String childJobId; // 子任务ID,多个逗号分隔 42 | 43 | protected TriggerStatusEnum triggerStatus; // 调度状态:0-停止,1-运行 44 | protected long triggerLastTime; // 上次调度时间 45 | protected long triggerNextTime; // 下次调度时间 46 | 47 | } 48 | -------------------------------------------------------------------------------- /src/main/java/com/xiaogang/xxljobadminsdk/model/JobUpdateParam.java: -------------------------------------------------------------------------------- 1 | package com.xiaogang.xxljobadminsdk.model; 2 | 3 | import com.xiaogang.xxljobadminsdk.constants.ExecutorBlockStrategyEnum; 4 | import com.xiaogang.xxljobadminsdk.constants.ExecutorRouteStrategyEnum; 5 | import com.xiaogang.xxljobadminsdk.constants.MisfireStrategyEnum; 6 | import com.xiaogang.xxljobadminsdk.constants.ScheduleTypeEnum; 7 | import lombok.Data; 8 | 9 | @Data 10 | public class JobUpdateParam { 11 | /** 12 | * 执行器 13 | */ 14 | private int jobGroup; 15 | 16 | /** 17 | * 任务描述 18 | */ 19 | private String jobDesc; 20 | 21 | /** 22 | * 负责人 23 | */ 24 | private String author; 25 | 26 | /** 27 | * 报警邮件 28 | */ 29 | private String alarmEmail; 30 | 31 | /** 32 | * 调度类型 33 | */ 34 | private ScheduleTypeEnum scheduleType; 35 | 36 | /** 37 | * 调度类型对应配置 38 | */ 39 | private String scheduleConf; 40 | 41 | /** 42 | * JobHandler 43 | */ 44 | private String executorHandler; 45 | 46 | /** 47 | * 任务参数 48 | */ 49 | private String executorParam; 50 | 51 | /** 52 | * 路由策略 53 | */ 54 | private ExecutorRouteStrategyEnum executorRouteStrategy; 55 | 56 | /** 57 | * 子任务ID 58 | */ 59 | private Integer childJobId; 60 | 61 | /** 62 | * 调度过期策略 63 | */ 64 | private MisfireStrategyEnum misfireStrategy; 65 | 66 | /** 67 | * 阻塞处理策略 68 | */ 69 | private ExecutorBlockStrategyEnum executorBlockStrategy; 70 | 71 | /** 72 | * 任务超时时间 73 | */ 74 | private Integer executorTimeout; 75 | 76 | /** 77 | * 失败重试次数 78 | */ 79 | private Integer executorFailRetryCount; 80 | 81 | /** 82 | * 任务id 83 | */ 84 | private Integer id; 85 | 86 | } 87 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 更新说明:2025-08-16 2 | 3 | 1. 升级项目SpringBoot版本为3.0.2 4 | 2. 升级项目JDK版本为17 5 | 3. 升级项目依赖的xxl-job版本为3.1.1并适配 6 | 4. 之后版本号和xxl-job版本号保持一致 7 | 5. 新版本还未上传maven中央仓库,暂时需要本地打包 8 | 9 | # 关于文档 10 | 1. 此项目比较简单,所有的功能都在XxlJobService接口类里面,方法声明有注释,一看就明白作用。类路径:src/main/java/com/xiaogang/xxljobadminsdk/service/XxlJobService.java 11 | 2. 有任何问题欢迎看当前页面底部的加QQ群方式进群讨论 12 | 13 | # 更新说明:2025-03-20 14 | 1. 有些小伙伴使用报错,高频的问题是因为搭建的xxl-job-admin版本过高,注意当前项目的版本分两部分,第一部分对应的是xxl-job-admin版本,第二部分是当前项目的版本,xxl-job-admin的版本一定要选对。例如当前项目版本是2.3.1-xxxxx,那么搭建xxl-job-admin的时候就要搭建2.3.1版本,否则可能出现未知问题。如果一定要选择高版本,可以自行修改本项目代码适配。 15 | 2. 为爱发电没有太多时间维护这个项目,如果大家适配了新的版本测试没问题可以提交合并请求,一起为开源贡献自己一点力量,项目开发者会给你署名,也是一个小小的荣誉。 16 | 17 | # 更新说明:2023-10-13 18 | 1.在2.3.1版本基础上添加了自动注册执行器与jobHandler的功能,直接使用@xxlRegistry注解标识jobHandler需要自动注册,如需自动注入,需配置groupTitle 19 | 20 | # 更新说明:2023-03-21(已上传MAVEN中央仓库) 21 | 1. 升级xxl-job-core到最新版(2.3.1),新版本消除了缺陷,其它更新可以查看官网 22 | 2. 升级项目第三方组件依赖的版本,升级到没有漏洞缺陷的版本 23 | 24 | # 更新说明:2023-03-17 25 | 1. 项目启动之前校验每一个配置参数,如果参数错误会终止项目启动,避免配置错误却不知道执行器启动失败 26 | 2. 将accessToken校验提前到项目启动完成之前,避免accessToken配置错误但是项目还是启动成功影响业务 27 | 3. 每个配置参数添加对应错误提示 28 | 4. 减少不必要的配置参数,降低集成成本,更好使用 29 | 5. 不用再配置jobGroupId,添加任务的执行器默认为appname对应的执行器id 30 | 6. 新增数个操作任务的方法,现在任务相关CRUD方法更充足,多样 31 | 7. 多个方法重载实现相同功能,降低方法调用成本。删除不必要参数 32 | 8. 新增查询执行器功能 33 | 9. 新增只在某个时间执行一次的任务方法,参数更少,添加任务更方便 34 | 10. 新增通过自定义字符串id作为唯一条件查询任务信息或者任务id,操作某个任务更方便(使用的任务负责人(author)字段实现,xxl-job的负责人字段查询是模糊查询,所以自定义id需要差别尽量大) 35 | 11. 删除,停止,启动都提供了两种方法,分别操作一个和操作符合条件的所有任务 36 | 12. 2.3.0-jobinfo-executor-2是最新版并合并到了master 37 | 13. bug修复 38 | 39 | # 项目介绍 40 | 1. 使用java代码控制xxl-job-admin。使用代码添加job的CRUD等功能 41 | 2. 项目使用的xxl-job-admin版本为2.3.0 42 | 3. 此项目版本号对应xxl-job-admin版本号 43 | 4. 配置了用户名密码之后,此模块会模拟登录请求admin来实现功能 44 | 5. 想要通过代码往admin里面操作job等功能,只需要在springboot项目中引入此项目,配置关键参数,引入sdk类就可以了,其它什么都不用关心了 45 | 6. 默认配置了XxlJobSpringExecutor,所以不用再额外配置此类交给Spring管理了 46 | 47 | 下面是自动配置类,默认配置如下 48 | ``` 49 | @Data 50 | @ConfigurationProperties(prefix = "xxl.job.sdk") 51 | @Configuration 52 | public class XxlJobAdminProperties { 53 | private String adminUrl = "http://localhost:8080/xxl-job-admin"; 54 | private String userName = "admin"; 55 | private String password = "123456"; 56 | private Integer connectionTimeOut = 5000; 57 | 58 | //执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册 59 | private String appname; 60 | //执行器通讯TOKEN [选填]:非空时启用; 61 | private String accessToken; 62 | //执行器注册 [选填]:优先使用该配置作为注册地址,为空时使用内嵌服务 ”IP:PORT“ 作为注册地址。从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。 63 | private String address; 64 | //执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务"; 65 | private String ip; 66 | //执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口; 67 | private Integer port; 68 | //执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径; 69 | private String logPath; 70 | //执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能; 71 | private Integer logRetentionDays = 30; 72 | 73 | } 74 | ``` 75 | # 使用方法 76 | ``` 77 | 78 | com.lxgnb 79 | xxl-job-boot-starter 80 | 2.3.0-jobinfo-executor-2 81 | 82 | ``` 83 | 1. pom文件中添加上面的依赖坐标(已上传到maven中央仓库) 84 | 2. 添加配置项,配置参数如下 85 | 3. image 86 | 4. 接下来注入关键的类,使用XxlJobService来控制job的crud 87 | 5. image 88 | 89 | ## 添加job 90 | 1. 添加任务有四个方法,对应的参数个数不一样,截图如下 91 | 3. ![image](https://user-images.githubusercontent.com/18614347/226236154-0cff3bfa-c997-4d3a-b5c0-3aa898556547.png) 92 | 4. XxlJobInfo 这是参数最全的类,官方有哪些参数,这个类就有哪些字段 93 | 5. XxlJobInfoAddParam 这个是必填参数,其它参数和在网页上添加任务的默认参数一样 94 | 6. DefaultXxlJobAddParam 这个和 XxlJobInfoAddParam差不多,区别在于默认参数这个类也有字段,可以修改,XxlJobInfoAddParam就只有必填参数,不能修改默认参数 95 | 7. addJustExecuteOnceJob是2.3.0-jobinfo-executor-2新增的方法,因为很多业务只需要执行一次,为了方便添加此类业务,新增了此方法,并且还有和此配套的getJobIdByCustomId方法,方便对此任务进行修改或者删除 96 | 8. 之所以提供三个方法来添加任务是为了方便添加任务,不用每个参数都去设置 97 | 98 | 99 | 使用方法就是这样,后续看项目情况也许会接入其它接口。 100 | 如果大家有什么问题,欢迎大家提出来。这个项目写的很粗糙,大家有什么意见和建议,非常欢迎大家来交流。谢谢 101 | 102 | ## 微信群 103 | 104 | ![image](https://user-images.githubusercontent.com/18614347/226236677-24f4fe3d-cfd8-49cf-9015-4f4d636113e6.png) 105 | 106 | ## QQ群 107 | 点击链接加入群聊【xxl-job-boot-starter】:https://jq.qq.com/?_wv=1027&k=7T9xX7XY 108 | 群号:709425770 109 | 110 | -------------------------------------------------------------------------------- /src/main/java/com/xiaogang/xxljobadminsdk/service/XxlJobService.java: -------------------------------------------------------------------------------- 1 | package com.xiaogang.xxljobadminsdk.service; 2 | 3 | import com.xiaogang.xxljobadminsdk.constants.TriggerStatusEnum; 4 | import com.xiaogang.xxljobadminsdk.dto.JobGroupQuery; 5 | import com.xiaogang.xxljobadminsdk.dto.JobQuery; 6 | import com.xiaogang.xxljobadminsdk.model.DefaultXxlJobAddParam; 7 | import com.xiaogang.xxljobadminsdk.model.JobUpdateParam; 8 | import com.xiaogang.xxljobadminsdk.model.XxlJobInfo; 9 | import com.xiaogang.xxljobadminsdk.model.XxlJobInfoAddParam; 10 | import com.xiaogang.xxljobadminsdk.vo.JobGroupPageResult; 11 | import com.xiaogang.xxljobadminsdk.vo.JobInfoPageItem; 12 | import com.xiaogang.xxljobadminsdk.vo.JobInfoPageResult; 13 | 14 | import java.util.Date; 15 | import java.util.List; 16 | 17 | public interface XxlJobService { 18 | 19 | String jobAddPath = "/jobinfo/add"; 20 | String jobDeletePath = "/jobinfo/remove"; 21 | String jobUpdatePath = "/jobinfo/update"; 22 | String jobStartPath = "/jobinfo/start"; 23 | String jobStopPath = "/jobinfo/stop"; 24 | String jobTriggerPath = "/jobinfo/trigger"; 25 | String jobPageListPath = "/jobinfo/pageList"; 26 | String jobNextTriggerTimePath = "/jobinfo/nextTriggerTime"; 27 | String jobGroupListPath = "/jobgroup/pageList"; 28 | 29 | /** 30 | * 分页查询任务数据 31 | * @param jobQuery 32 | * @return 33 | */ 34 | JobInfoPageResult pageList(JobQuery jobQuery); 35 | 36 | /** 37 | * 分页查询执行器数据 38 | * @param jobGroupQuery 39 | * @return 40 | */ 41 | JobGroupPageResult pageList(JobGroupQuery jobGroupQuery); 42 | 43 | /** 44 | * 通过执行器名称查询执行器id 45 | * @param appName 46 | * @return 47 | */ 48 | int getFirstJobGroupIdByAppName(String appName); 49 | 50 | /** 51 | * 通过配置的appname查询执行器id 52 | * @return 53 | */ 54 | int getDefaultJobGroupId(); 55 | 56 | /** 57 | * 包含添加job的所有参数 58 | * 59 | * @param jobInfo 任务信息 60 | * @return 任务id 61 | */ 62 | Integer add(XxlJobInfo jobInfo); 63 | 64 | /** 65 | * 通过必要参数添加job,其它参数和通过网页添加job的默认参数一样 66 | * @param addParam 67 | * @return 68 | */ 69 | Integer add(XxlJobInfoAddParam addParam); 70 | 71 | /** 72 | * 通过必要参数添加job,其它参数和通过网页添加job的默认参数一样。但是可以修改默认参数 73 | * @param defaultXxlJobAddParam 74 | * @return 75 | */ 76 | Integer add(DefaultXxlJobAddParam defaultXxlJobAddParam); 77 | 78 | /** 79 | * 添加只在将来执行一次的任务 80 | * @param customId 自定义的唯一的业务id,此id在所有任务中保持唯一 81 | * @param triggerTime 任务执行时间,必须大于当前时间 82 | * @param executorParam 任务执行参数 83 | * @param executorHandler 任务处理器,关联@XxlJob的value 84 | * @return 85 | */ 86 | Integer addJustExecuteOnceJob(String customId, Date triggerTime, String executorParam, String executorHandler); 87 | 88 | /** 89 | * 通过自定义的唯一业务id查询任务id 90 | * @param customId 91 | * @return 92 | */ 93 | Integer getJobIdByCustomId(String customId); 94 | 95 | /** 96 | * 通过自定义的唯一业务id查询任务 97 | * @param customId 98 | * @return 99 | */ 100 | JobInfoPageItem getJobByCustomId(String customId); 101 | 102 | /** 103 | * update job 104 | * 105 | * @param jobUpdateParam 任务信息 106 | */ 107 | void update(JobUpdateParam jobUpdateParam); 108 | 109 | /** 110 | * 修改任务 111 | * @param jobInfoPageItem 112 | */ 113 | void update(JobInfoPageItem jobInfoPageItem); 114 | 115 | /** 116 | * 数据类型转换 117 | * @param jobInfoPageItem 118 | * @return 119 | */ 120 | JobUpdateParam transform(JobInfoPageItem jobInfoPageItem); 121 | 122 | /** 123 | * remove job 124 | * * 125 | * @param id 任务id 126 | */ 127 | void remove(int id); 128 | 129 | 130 | /** 131 | * 删除符合条件的所有任务---默认的执行器 132 | * @param triggerStatus 133 | * @param jobDesc 134 | * @param executorHandler 135 | * @param author 136 | */ 137 | void remove(TriggerStatusEnum triggerStatus, String jobDesc, String executorHandler, String author); 138 | 139 | 140 | /** 141 | * start job 142 | * 143 | * @param id 任务id 144 | */ 145 | void start(int id); 146 | 147 | /** 148 | * 开始所有符合条件的任务 149 | * @param triggerStatus 150 | * @param jobDesc 151 | * @param executorHandler 152 | * @param author 153 | */ 154 | void start(TriggerStatusEnum triggerStatus, String jobDesc, String executorHandler, String author); 155 | 156 | /** 157 | * stop job 158 | * 159 | * @param id 任务id 160 | */ 161 | void stop(int id); 162 | 163 | /** 164 | * 停止所有符合条件的任务 165 | * @param triggerStatus 166 | * @param jobDesc 167 | * @param executorHandler 168 | * @param author 169 | */ 170 | void stop(TriggerStatusEnum triggerStatus, String jobDesc, String executorHandler, String author); 171 | 172 | void triggerJob(int id, String executorParam, String addressList); 173 | 174 | List nextTriggerTime(String scheduleType, String scheduleConf); 175 | 176 | } 177 | -------------------------------------------------------------------------------- /src/main/java/com/xiaogang/xxljobadminsdk/config/XxlJobAdminAutoConfigure.java: -------------------------------------------------------------------------------- 1 | package com.xiaogang.xxljobadminsdk.config; 2 | 3 | import cn.hutool.core.lang.Assert; 4 | import cn.hutool.core.util.StrUtil; 5 | import cn.hutool.http.HttpRequest; 6 | import cn.hutool.http.HttpResponse; 7 | import cn.hutool.json.JSONUtil; 8 | import com.xiaogang.xxljobadminsdk.dto.HttpHeader; 9 | import com.xiaogang.xxljobadminsdk.dto.ReturnT; 10 | import com.xiaogang.xxljobadminsdk.service.XxlJobService; 11 | import com.xiaogang.xxljobadminsdk.service.impl.XxlJobServiceImpl; 12 | import com.xxl.job.core.biz.AdminBiz; 13 | import com.xxl.job.core.biz.client.AdminBizClient; 14 | import com.xxl.job.core.biz.model.RegistryParam; 15 | import com.xxl.job.core.enums.RegistryConfig; 16 | import com.xxl.job.core.executor.impl.XxlJobSpringExecutor; 17 | import com.xxl.job.core.util.IpUtil; 18 | import com.xxl.job.core.util.NetUtil; 19 | import org.slf4j.Logger; 20 | import org.slf4j.LoggerFactory; 21 | import org.springframework.boot.context.properties.EnableConfigurationProperties; 22 | import org.springframework.context.annotation.Bean; 23 | import org.springframework.context.annotation.Configuration; 24 | 25 | import java.net.HttpCookie; 26 | import java.net.UnknownHostException; 27 | import java.util.HashMap; 28 | import java.util.Map; 29 | 30 | @Configuration 31 | @EnableConfigurationProperties(XxlJobAdminProperties.class) 32 | public class XxlJobAdminAutoConfigure { 33 | 34 | private Logger logger = LoggerFactory.getLogger(XxlJobAdminAutoConfigure.class); 35 | 36 | @Bean("loginHeader") 37 | public HttpHeader httpRequest(XxlJobAdminProperties xxlJobAdminProperties) { 38 | logger.info(">>>>>>>>>>> xxl-job config init. httpRequest"); 39 | String adminUrl = xxlJobAdminProperties.getAdminUrl(); 40 | Assert.notBlank(adminUrl, "请配置adminUrl"); 41 | 42 | // Integer jobGroupId = xxlJobAdminProperties.getJobGroupId(); 43 | // Assert.notNull(jobGroupId, "请配置jobGroupId"); 44 | 45 | String userName = xxlJobAdminProperties.getUserName(); 46 | String password = xxlJobAdminProperties.getPassword(); 47 | int connectionTimeOut = xxlJobAdminProperties.getConnectionTimeOut(); 48 | 49 | Map paramMap = new HashMap<>(); 50 | paramMap.put("userName", userName); 51 | paramMap.put("password", password); 52 | 53 | HttpResponse httpResponse = null; 54 | try { 55 | httpResponse = HttpRequest.post(adminUrl + "/login").form(paramMap).timeout(connectionTimeOut).execute(); 56 | } catch (Exception e) { 57 | Assert.isTrue(false, "链接xxl-job服务失败,请检查xxl-job服务是否运行以及到xxl-job的网络是否通畅。当前链接地址:{}", adminUrl); 58 | } 59 | int status = httpResponse.getStatus(); 60 | Assert.isTrue(200 == status, "登录失败,请检查用户名密码是否正确"); 61 | 62 | String body = httpResponse.body(); 63 | ReturnT returnT = JSONUtil.toBean(body, ReturnT.class); 64 | 65 | Assert.isTrue(200 == returnT.getCode(), "登录失败,请检查用户名密码是否正确"); 66 | 67 | String cookieName = "XXL_JOB_LOGIN_IDENTITY"; 68 | HttpCookie cookie = httpResponse.getCookie(cookieName); 69 | Assert.notNull(cookie, "没有获取到登录成功的cookie,请检查登录连接或者参数是否正确"); 70 | 71 | String headerValue = new StringBuilder(cookieName).append("=").append(cookie.getValue()).toString(); 72 | HttpHeader loginHeader = new HttpHeader("Cookie", headerValue); 73 | 74 | return loginHeader; 75 | } 76 | 77 | 78 | @Bean 79 | public XxlJobService xxlJobService(HttpHeader loginHeader, XxlJobAdminProperties xxlJobAdminProperties) { 80 | logger.info(">>>>>>>>>>> xxl-job config init. xxlJobService"); 81 | XxlJobService xxlJobService = new XxlJobServiceImpl(loginHeader, xxlJobAdminProperties); 82 | return xxlJobService; 83 | } 84 | 85 | @Bean 86 | public XxlJobSpringExecutor xxlJobExecutor(XxlJobAdminProperties xxlJobAdminProperties) throws UnknownHostException { 87 | logger.info(">>>>>>>>>>> xxl-job config init. XxlJobSpringExecutor"); 88 | XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor(); 89 | String adminUrl = xxlJobAdminProperties.getAdminUrl(); 90 | Assert.notBlank(adminUrl, "xxl-job服务地址不能为空"); 91 | xxlJobSpringExecutor.setAdminAddresses(adminUrl); 92 | 93 | String appname = xxlJobAdminProperties.getAppname(); 94 | Assert.notBlank(appname, "请配置执行器参数appname"); 95 | xxlJobSpringExecutor.setAppname(appname); 96 | 97 | 98 | String address = xxlJobAdminProperties.getAddress(); 99 | 100 | String ip = xxlJobAdminProperties.getIp(); 101 | if (StrUtil.isBlank(ip)) { 102 | ip = IpUtil.getIp(); 103 | } 104 | xxlJobSpringExecutor.setIp(ip); 105 | 106 | Integer port = xxlJobAdminProperties.getPort(); 107 | if (port == null) { 108 | port = NetUtil.findAvailablePort(9999); 109 | } 110 | xxlJobSpringExecutor.setPort(port); 111 | 112 | if (StrUtil.isBlank(address)) { 113 | String ip_port_address = IpUtil.getIpPort(ip, port); 114 | address = "http://{ip_port}/".replace("{ip_port}", ip_port_address); 115 | } 116 | xxlJobSpringExecutor.setAddress(address); 117 | 118 | String accessToken = xxlJobAdminProperties.getAccessToken(); 119 | if (StrUtil.isNotBlank(accessToken)) { 120 | xxlJobSpringExecutor.setAccessToken(accessToken); 121 | } 122 | 123 | String logPath = xxlJobAdminProperties.getLogPath(); 124 | if (StrUtil.isNotBlank(logPath)) { 125 | xxlJobSpringExecutor.setLogPath(logPath); 126 | } 127 | 128 | Integer logRetentionDays = xxlJobAdminProperties.getLogRetentionDays(); 129 | if (logRetentionDays != null) { 130 | xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays); 131 | } 132 | 133 | RegistryParam registryParam = new RegistryParam(RegistryConfig.RegistType.EXECUTOR.name(), appname, address); 134 | AdminBiz adminBiz = new AdminBizClient(adminUrl.trim(), accessToken, xxlJobAdminProperties.getConnectionTimeOut()); 135 | try { 136 | com.xxl.job.core.biz.model.ReturnT registryResult = adminBiz.registry(registryParam); 137 | if (registryResult != null && com.xxl.job.core.biz.model.ReturnT.SUCCESS_CODE == registryResult.getCode()) { 138 | registryResult = com.xxl.job.core.biz.model.ReturnT.SUCCESS; 139 | logger.debug(">>>>>>>>>>> xxl-job registry success, registryParam:{}, registryResult:{}", new Object[]{registryParam, registryResult}); 140 | } else { 141 | logger.info(">>>>>>>>>>> xxl-job registry fail, registryParam:{}, registryResult:{}", new Object[]{registryParam, registryResult}); 142 | Assert.isTrue(false, ">>>>>>>>>>> xxl-job registry fail, registryParam:{}, registryResult:{}", new Object[]{registryParam, registryResult}); 143 | } 144 | } catch (Exception e) { 145 | logger.info(">>>>>>>>>>> xxl-job registry error, registryParam:{}", registryParam, e); 146 | Assert.isTrue(false, ">>>>>>>>>>> xxl-job registry error, registryParam:{}", registryParam, e); 147 | } 148 | 149 | return xxlJobSpringExecutor; 150 | } 151 | } 152 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | com.lxgnb 6 | xxl-job-boot-starter 7 | 3.1.1 8 | xxl-job-admin-sdk 9 | xxl-job-boot-starter 10 | https://github.com/aitxiaogang/xxl-job-boot-starter.git 11 | 12 | 13 | 17 14 | UTF-8 15 | 17 16 | 17 17 | 5.8.36 18 | 19 | 20 | 21 | org.springframework.boot 22 | spring-boot-autoconfigure 23 | 24 | 25 | org.projectlombok 26 | lombok 27 | true 28 | 29 | 30 | org.springframework.boot 31 | spring-boot-configuration-processor 32 | true 33 | 34 | 35 | cn.hutool 36 | hutool-all 37 | ${hutool.version} 38 | 39 | 40 | com.alibaba.fastjson2 41 | fastjson2 42 | 2.0.57 43 | 44 | 45 | com.xuxueli 46 | xxl-job-core 47 | 3.1.1 48 | 49 | 50 | 51 | 52 | 53 | The Apache Software License, Version 2.0 54 | http://www.apache.org/licenses/LICENSE-2.0.txt 55 | 56 | 57 | 58 | scm:git:git://github.com/aitxiaogang/xxl-job-admin-sdk-boot-starter.git 59 | scm:git:ssh://github.com/aitxiaogang/xxl-job-admin-sdk-boot-starter.git 60 | https://github.com/aitxiaogang/xxl-job-admin-sdk-boot-starter.git 61 | 62 | 63 | 64 | 65 | lixiaogang 66 | aitxiaogang@163.com 67 | https://github.com/aitxiaogang 68 | 69 | 70 | 71 | 72 | 73 | 74 | org.springframework.boot 75 | spring-boot-dependencies 76 | 3.0.2 77 | pom 78 | import 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | org.apache.maven.plugins 87 | maven-compiler-plugin 88 | 89 | true 90 | 91 | -parameters 92 | 93 | 17 94 | 17 95 | 96 | 97 | 98 | org.apache.maven.plugins 99 | maven-surefire-plugin 100 | 101 | 102 | --add-opens java.base/java.lang=ALL-UNNAMED 103 | --add-opens java.base/java.util=ALL-UNNAMED 104 | 105 | 106 | 107 | 108 | org.apache.maven.plugins 109 | maven-javadoc-plugin 110 | 2.9.1 111 | 112 | UTF-8 113 | true 114 | UTF-8 115 | UTF-8 116 | 117 | 118 | 119 | attach-javadocs 120 | 121 | jar 122 | 123 | 124 | 125 | 126 | 127 | org.apache.maven.plugins 128 | maven-source-plugin 129 | 3.0.0 130 | 131 | 132 | 133 | 134 | compile 135 | 136 | 137 | jar-no-fork 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | ossrh 148 | 149 | true 150 | 151 | 152 | 153 | 154 | 155 | org.apache.maven.plugins 156 | maven-source-plugin 157 | 2.2.1 158 | 159 | 160 | attach-sources 161 | 162 | jar-no-fork 163 | 164 | 165 | 166 | 167 | 168 | org.apache.maven.plugins 169 | maven-javadoc-plugin 170 | 2.9.1 171 | 172 | ../javadocs 173 | easy-delivery 174 | 175 | 176 | 177 | 178 | org.apache.maven.plugins 179 | maven-gpg-plugin 180 | 1.5 181 | 182 | 183 | sign-artifacts 184 | verify 185 | 186 | sign 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | ossrh 196 | https://s01.oss.sonatype.org/content/repositories/snapshots 197 | 198 | 199 | ossrh 200 | https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/ 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | -------------------------------------------------------------------------------- /src/main/java/com/xiaogang/xxljobadminsdk/service/impl/XxlJobServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.xiaogang.xxljobadminsdk.service.impl; 2 | 3 | import cn.hutool.core.collection.CollUtil; 4 | import cn.hutool.core.lang.Assert; 5 | import cn.hutool.core.util.PageUtil; 6 | import cn.hutool.http.HttpRequest; 7 | import cn.hutool.http.HttpResponse; 8 | import com.alibaba.fastjson2.JSON; 9 | import com.alibaba.fastjson2.JSONObject; 10 | import com.alibaba.fastjson2.TypeReference; 11 | import com.xiaogang.xxljobadminsdk.config.XxlJobAdminProperties; 12 | import com.xiaogang.xxljobadminsdk.constants.*; 13 | import com.xiaogang.xxljobadminsdk.dto.HttpHeader; 14 | import com.xiaogang.xxljobadminsdk.dto.JobGroupQuery; 15 | import com.xiaogang.xxljobadminsdk.dto.JobQuery; 16 | import com.xiaogang.xxljobadminsdk.dto.ReturnT; 17 | import com.xiaogang.xxljobadminsdk.model.DefaultXxlJobAddParam; 18 | import com.xiaogang.xxljobadminsdk.model.JobUpdateParam; 19 | import com.xiaogang.xxljobadminsdk.model.XxlJobInfo; 20 | import com.xiaogang.xxljobadminsdk.model.XxlJobInfoAddParam; 21 | import com.xiaogang.xxljobadminsdk.service.XxlJobService; 22 | import com.xiaogang.xxljobadminsdk.utils.MyUtil; 23 | import com.xiaogang.xxljobadminsdk.vo.DataItem; 24 | import com.xiaogang.xxljobadminsdk.vo.JobGroupPageResult; 25 | import com.xiaogang.xxljobadminsdk.vo.JobInfoPageItem; 26 | import com.xiaogang.xxljobadminsdk.vo.JobInfoPageResult; 27 | import lombok.extern.slf4j.Slf4j; 28 | import org.springframework.beans.BeanUtils; 29 | 30 | import java.util.Date; 31 | import java.util.HashMap; 32 | import java.util.List; 33 | import java.util.Map; 34 | 35 | @Slf4j 36 | public class XxlJobServiceImpl implements XxlJobService { 37 | 38 | private HttpHeader loginHeader; 39 | 40 | private XxlJobAdminProperties xxlJobAdminProperties; 41 | 42 | private int timeout; 43 | 44 | public XxlJobServiceImpl(HttpHeader loginHeader, XxlJobAdminProperties xxlJobAdminProperties) { 45 | this.loginHeader = loginHeader; 46 | this.xxlJobAdminProperties = xxlJobAdminProperties; 47 | this.timeout = this.xxlJobAdminProperties.getConnectionTimeOut(); 48 | } 49 | 50 | @Override 51 | public JobInfoPageResult pageList(JobQuery jobQuery) { 52 | this.validQueryParam(jobQuery); 53 | HttpRequest httpRequest = this.getHttpRequest(jobPageListPath); 54 | Map paramMap = new HashMap(); 55 | paramMap.put("start",jobQuery.getStart()); 56 | paramMap.put("length",jobQuery.getLength()); 57 | paramMap.put("jobGroup",jobQuery.getJobGroup()); 58 | TriggerStatusEnum triggerStatus = jobQuery.getTriggerStatus(); 59 | paramMap.put("triggerStatus", triggerStatus.getStatus() != null ? triggerStatus.getStatus() : TriggerStatusEnum.ALL); 60 | paramMap.put("jobDesc",jobQuery.getJobDesc() != null ? jobQuery.getJobDesc() : ""); 61 | paramMap.put("executorHandler",jobQuery.getExecutorHandler() != null ? jobQuery.getExecutorHandler() : ""); 62 | paramMap.put("author",jobQuery.getAuthor() != null ? jobQuery.getAuthor() : ""); 63 | 64 | HttpResponse response = httpRequest.form(paramMap).timeout(timeout).execute(); 65 | int status = response.getStatus(); 66 | String body = response.body(); 67 | log.debug("status:{},body:{}",status,body); 68 | Assert.isTrue(status == 200,body); 69 | JobInfoPageResult jobInfoPageResult = JSON.parseObject(body, JobInfoPageResult.class); 70 | 71 | return jobInfoPageResult; 72 | } 73 | 74 | @Override 75 | public JobGroupPageResult pageList(JobGroupQuery jobGroupQuery) { 76 | this.validQueryParam(jobGroupQuery); 77 | HttpRequest httpRequest = this.getHttpRequest(jobGroupListPath); 78 | Map paramMap = new HashMap(); 79 | paramMap.put("start",jobGroupQuery.getStart()); 80 | paramMap.put("length",jobGroupQuery.getLength()); 81 | paramMap.put("appname",jobGroupQuery.getAppname() != null ? jobGroupQuery.getAppname() : ""); 82 | paramMap.put("title",jobGroupQuery.getTitle() != null ? jobGroupQuery.getTitle() : ""); 83 | 84 | HttpResponse response = httpRequest.form(paramMap).timeout(timeout).execute(); 85 | int status = response.getStatus(); 86 | String body = response.body(); 87 | log.debug("status:{},body:{}",status,body); 88 | Assert.isTrue(status == 200,body); 89 | JobGroupPageResult jobInfoPageResult = JSON.parseObject(body, JobGroupPageResult.class); 90 | 91 | return jobInfoPageResult; 92 | } 93 | 94 | @Override 95 | public int getFirstJobGroupIdByAppName(String appName) { 96 | JobGroupQuery jobGroupQuery = new JobGroupQuery(); 97 | jobGroupQuery.setStart(0); 98 | jobGroupQuery.setLength(1); 99 | jobGroupQuery.setAppname(appName); 100 | jobGroupQuery.setTitle(""); 101 | JobGroupPageResult jobGroupPageResult = this.pageList(jobGroupQuery); 102 | String errorMsgTemplate = "查询结果为空,请检查是否创建对应名称的执行器"; 103 | Assert.notNull(jobGroupPageResult, errorMsgTemplate); 104 | List data = jobGroupPageResult.getData(); 105 | Assert.isTrue(CollUtil.isNotEmpty(data), errorMsgTemplate); 106 | DataItem dataItem = data.get(0); 107 | int id = dataItem.getId(); 108 | return id; 109 | } 110 | 111 | @Override 112 | public int getDefaultJobGroupId() { 113 | String appname = xxlJobAdminProperties.getAppname(); 114 | int jobGroupIdByAppName = this.getFirstJobGroupIdByAppName(appname); 115 | return jobGroupIdByAppName; 116 | } 117 | 118 | private void validQueryParam(JobGroupQuery jobGroupQuery) { 119 | int start = jobGroupQuery.getStart(); 120 | Assert.notNull(start,"分页参数start不能为null"); 121 | int length = jobGroupQuery.getLength(); 122 | Assert.notNull(length,"分页参数length不能为null"); 123 | } 124 | 125 | private void validQueryParam(JobQuery jobQuery){ 126 | int jobGroup = jobQuery.getJobGroup(); 127 | Assert.notNull(jobGroup,"jobGroup不能为null"); 128 | TriggerStatusEnum triggerStatus = jobQuery.getTriggerStatus(); 129 | Assert.notNull(triggerStatus,"triggerStatus不能为null"); 130 | int start = jobQuery.getStart(); 131 | Assert.notNull(start,"分页参数start不能为null"); 132 | int length = jobQuery.getLength(); 133 | Assert.notNull(length,"分页参数length不能为null"); 134 | } 135 | 136 | @Override 137 | public Integer add(XxlJobInfo jobInfo) { 138 | HttpRequest httpRequest = postHttpRequest(jobAddPath); 139 | JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(jobInfo)); 140 | ReturnT returnT = requestXxlJobAdmin(httpRequest, jsonObject, new TypeReference<>() {}); 141 | return Integer.valueOf(returnT.getContent()); 142 | } 143 | 144 | @Override 145 | public Integer add(XxlJobInfoAddParam addParam) { 146 | DefaultXxlJobAddParam defaultXxlJobAddParam = new DefaultXxlJobAddParam(); 147 | BeanUtils.copyProperties(addParam,defaultXxlJobAddParam); 148 | Integer jobId = this.add(defaultXxlJobAddParam); 149 | return jobId; 150 | } 151 | 152 | @Override 153 | public Integer addJustExecuteOnceJob(String customId, Date triggerTime, String executorParam, String executorHandler) { 154 | JobInfoPageItem jobInfoPageItem = this.getJobByCustomId(customId); 155 | Assert.isNull(jobInfoPageItem,"已经存在自定义id为{}的任务,请修改",customId); 156 | Date now = new Date(); 157 | boolean after = triggerTime.after(now); 158 | Assert.isTrue(after,"任务执行时间必须大于当前时间"); 159 | XxlJobInfoAddParam addParam = new XxlJobInfoAddParam(); 160 | addParam.setJobDesc("none"); 161 | addParam.setAuthor(customId); 162 | addParam.setScheduleType(ScheduleTypeEnum.CRON); 163 | 164 | String cron = MyUtil.getCron(triggerTime); 165 | addParam.setScheduleConf(cron); 166 | addParam.setExecutorHandler(executorHandler); 167 | addParam.setExecutorParam(executorParam); 168 | Integer jobId = this.add(addParam); 169 | return jobId; 170 | } 171 | 172 | @Override 173 | public Integer getJobIdByCustomId(String customId) { 174 | JobInfoPageItem jobInfoPageItem = this.getJobByCustomId(customId); 175 | if (jobInfoPageItem == null) { 176 | return null; 177 | } 178 | return jobInfoPageItem.getId(); 179 | } 180 | 181 | @Override 182 | public JobInfoPageItem getJobByCustomId(String customId) { 183 | JobQuery jobQuery = new JobQuery(); 184 | jobQuery.setStart(0); 185 | jobQuery.setLength(1); 186 | int jobGroup = this.getDefaultJobGroupId(); 187 | jobQuery.setJobGroup(jobGroup); 188 | jobQuery.setTriggerStatus(TriggerStatusEnum.ALL); 189 | jobQuery.setAuthor(customId); 190 | JobInfoPageResult jobInfoPageResult = this.pageList(jobQuery); 191 | List data = jobInfoPageResult.getData(); 192 | if (CollUtil.isEmpty(data)) { 193 | return null; 194 | } 195 | JobInfoPageItem jobInfoPageItem = data.get(0); 196 | return jobInfoPageItem; 197 | } 198 | 199 | @Override 200 | public Integer add(DefaultXxlJobAddParam defaultXxlJobAddParam) { 201 | XxlJobInfo jobInfo = new XxlJobInfo(); 202 | ScheduleTypeEnum scheduleType = defaultXxlJobAddParam.getScheduleType(); 203 | if (scheduleType != null) { 204 | jobInfo.setScheduleType(scheduleType); 205 | } 206 | MisfireStrategyEnum misfireStrategy = defaultXxlJobAddParam.getMisfireStrategy(); 207 | if (misfireStrategy != null) { 208 | jobInfo.setMisfireStrategy(misfireStrategy); 209 | } 210 | ExecutorRouteStrategyEnum executorRouteStrategy = defaultXxlJobAddParam.getExecutorRouteStrategy(); 211 | if (executorRouteStrategy != null) { 212 | jobInfo.setExecutorRouteStrategy(executorRouteStrategy); 213 | } 214 | ExecutorBlockStrategyEnum executorBlockStrategy = defaultXxlJobAddParam.getExecutorBlockStrategy(); 215 | if (executorBlockStrategy != null) { 216 | jobInfo.setExecutorBlockStrategy(executorBlockStrategy.name()); 217 | } 218 | GlueTypeEnum glueType = defaultXxlJobAddParam.getGlueType(); 219 | if (glueType != null) { 220 | jobInfo.setGlueType(glueType); 221 | } 222 | BeanUtils.copyProperties(defaultXxlJobAddParam,jobInfo); 223 | 224 | Integer jobGroupId = this.getDefaultJobGroupId(); 225 | jobInfo.setJobGroup(jobGroupId); 226 | 227 | this.validAddJobParam(jobInfo); 228 | Integer jobId = this.add(jobInfo); 229 | return jobId; 230 | } 231 | 232 | private void validAddJobParam(XxlJobInfo jobInfo){ 233 | Assert.notNull(jobInfo,"参数不能为null"); 234 | Assert.notNull(jobInfo.getJobGroup(),"jobGroup参数不能为null"); 235 | Assert.notNull(jobInfo.getJobDesc(),"jobDesc参数不能为null"); 236 | Assert.notNull(jobInfo.getAuthor(),"author参数不能为null"); 237 | Assert.notNull(jobInfo.getScheduleType(),"scheduleType参数不能为null"); 238 | Assert.notNull(jobInfo.getGlueType(),"glueType参数不能为null"); 239 | Assert.notNull(jobInfo.getExecutorHandler(),"executorHandler参数不能为null"); 240 | } 241 | 242 | @Override 243 | public void update(JobUpdateParam jobInfo) { 244 | HttpRequest httpRequest = postHttpRequest(jobUpdatePath); 245 | 246 | JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(jobInfo)); 247 | requestXxlJobAdmin(httpRequest, jsonObject,new TypeReference>(){}); 248 | } 249 | 250 | @Override 251 | public void update(JobInfoPageItem jobInfoPageItem) { 252 | JobUpdateParam xxlJobInfo = this.transform(jobInfoPageItem); 253 | this.update(xxlJobInfo); 254 | } 255 | 256 | 257 | @Override 258 | public JobUpdateParam transform(JobInfoPageItem jobInfoPageItem){ 259 | JobUpdateParam jobInfo = new JobUpdateParam(); 260 | jobInfo.setScheduleConf(jobInfoPageItem.getScheduleConf()); 261 | jobInfo.setId(jobInfoPageItem.getId()); 262 | jobInfo.setJobGroup(jobInfoPageItem.getJobGroup()); 263 | jobInfo.setJobDesc(jobInfoPageItem.getJobDesc()); 264 | jobInfo.setAuthor(jobInfoPageItem.getAuthor()); 265 | jobInfo.setAlarmEmail(jobInfoPageItem.getAlarmEmail()); 266 | jobInfo.setScheduleType(jobInfoPageItem.getScheduleType()); 267 | jobInfo.setMisfireStrategy(jobInfoPageItem.getMisfireStrategy()); 268 | jobInfo.setExecutorRouteStrategy(jobInfoPageItem.getExecutorRouteStrategy()); 269 | jobInfo.setExecutorHandler(jobInfoPageItem.getExecutorHandler()); 270 | jobInfo.setExecutorParam(jobInfoPageItem.getExecutorParam()); 271 | jobInfo.setExecutorBlockStrategy(jobInfoPageItem.getExecutorBlockStrategy()); 272 | jobInfo.setExecutorTimeout(jobInfoPageItem.getExecutorTimeout()); 273 | jobInfo.setExecutorFailRetryCount(jobInfoPageItem.getExecutorFailRetryCount()); 274 | jobInfo.setChildJobId(jobInfoPageItem.getChildJobId()); 275 | 276 | return jobInfo; 277 | } 278 | 279 | @Override 280 | public void remove(int id) { 281 | HttpRequest httpRequest = postHttpRequest(jobDeletePath); 282 | 283 | Map map = new HashMap<>(); 284 | map.put("id",id); 285 | requestXxlJobAdmin(httpRequest, map,new TypeReference>(){}); 286 | } 287 | 288 | @Override 289 | public void remove(TriggerStatusEnum triggerStatus, String jobDesc, String executorHandler, String author) { 290 | JobQuery jobQuery = new JobQuery(); 291 | jobQuery.setStart(0); 292 | jobQuery.setLength(10); 293 | jobQuery.setJobGroup(this.getDefaultJobGroupId()); 294 | 295 | jobQuery.setTriggerStatus(triggerStatus); 296 | jobQuery.setJobDesc(jobDesc); 297 | jobQuery.setExecutorHandler(executorHandler); 298 | jobQuery.setAuthor(author); 299 | JobInfoPageResult jobInfoPageResult = this.pageList(jobQuery); 300 | List data = jobInfoPageResult.getData(); 301 | if (CollUtil.isEmpty(data)) { 302 | return; 303 | } 304 | 305 | for (JobInfoPageItem item : data) { 306 | this.remove(item.getId()); 307 | } 308 | 309 | int recordsTotal = jobInfoPageResult.getRecordsTotal(); 310 | int totalPage = PageUtil.totalPage(recordsTotal, jobQuery.getLength()); 311 | for (int i = 1; i < totalPage; i++) { 312 | jobInfoPageResult = this.pageList(jobQuery); 313 | 314 | data = jobInfoPageResult.getData(); 315 | for (JobInfoPageItem item : data) { 316 | this.remove(item.getId()); 317 | } 318 | } 319 | } 320 | 321 | @Override 322 | public void start(TriggerStatusEnum triggerStatus, String jobDesc, String executorHandler, String author) { 323 | JobQuery jobQuery = new JobQuery(); 324 | jobQuery.setStart(0); 325 | jobQuery.setLength(10); 326 | jobQuery.setJobGroup(this.getDefaultJobGroupId()); 327 | 328 | jobQuery.setTriggerStatus(triggerStatus); 329 | jobQuery.setJobDesc(jobDesc); 330 | jobQuery.setExecutorHandler(executorHandler); 331 | jobQuery.setAuthor(author); 332 | JobInfoPageResult jobInfoPageResult = this.pageList(jobQuery); 333 | List data = jobInfoPageResult.getData(); 334 | if (CollUtil.isEmpty(data)) { 335 | return; 336 | } 337 | 338 | for (JobInfoPageItem item : data) { 339 | this.start(item.getId()); 340 | } 341 | 342 | int recordsTotal = jobInfoPageResult.getRecordsTotal(); 343 | int totalPage = PageUtil.totalPage(recordsTotal, jobQuery.getLength()); 344 | for (int i = 1; i < totalPage; i++) { 345 | int start = PageUtil.getStart(i, jobQuery.getLength()); 346 | jobQuery.setStart(start); 347 | jobInfoPageResult = this.pageList(jobQuery); 348 | 349 | data = jobInfoPageResult.getData(); 350 | for (JobInfoPageItem item : data) { 351 | this.start(item.getId()); 352 | } 353 | } 354 | } 355 | 356 | @Override 357 | public void start(int id) { 358 | HttpRequest httpRequest = postHttpRequest(jobStartPath); 359 | 360 | Map map = new HashMap<>(); 361 | map.put("id",id); 362 | requestXxlJobAdmin(httpRequest, map,new TypeReference>(){}); 363 | } 364 | 365 | @Override 366 | public void stop(int id) { 367 | HttpRequest httpRequest = postHttpRequest(jobStopPath); 368 | 369 | Map map = new HashMap<>(); 370 | map.put("id",id); 371 | requestXxlJobAdmin(httpRequest, map,new TypeReference>(){}); 372 | } 373 | 374 | @Override 375 | public void stop(TriggerStatusEnum triggerStatus, String jobDesc, String executorHandler, String author) { 376 | JobQuery jobQuery = new JobQuery(); 377 | jobQuery.setStart(0); 378 | jobQuery.setLength(10); 379 | jobQuery.setJobGroup(this.getDefaultJobGroupId()); 380 | 381 | jobQuery.setTriggerStatus(triggerStatus); 382 | jobQuery.setJobDesc(jobDesc); 383 | jobQuery.setExecutorHandler(executorHandler); 384 | jobQuery.setAuthor(author); 385 | JobInfoPageResult jobInfoPageResult = this.pageList(jobQuery); 386 | List data = jobInfoPageResult.getData(); 387 | if (CollUtil.isEmpty(data)) { 388 | return; 389 | } 390 | 391 | for (JobInfoPageItem item : data) { 392 | this.stop(item.getId()); 393 | } 394 | 395 | int recordsTotal = jobInfoPageResult.getRecordsTotal(); 396 | int totalPage = PageUtil.totalPage(recordsTotal, jobQuery.getLength()); 397 | for (int i = 1; i < totalPage; i++) { 398 | int start = PageUtil.getStart(i, jobQuery.getLength()); 399 | jobQuery.setStart(start); 400 | jobInfoPageResult = this.pageList(jobQuery); 401 | 402 | data = jobInfoPageResult.getData(); 403 | for (JobInfoPageItem item : data) { 404 | this.stop(item.getId()); 405 | } 406 | } 407 | } 408 | 409 | @Override 410 | public void triggerJob(int id, String executorParam, String addressList) { 411 | HttpRequest httpRequest = postHttpRequest(jobTriggerPath); 412 | 413 | Map map = new HashMap<>(); 414 | map.put("id",id); 415 | map.put("executorParam",executorParam); 416 | map.put("addressList",addressList); 417 | requestXxlJobAdmin(httpRequest, map,new TypeReference>(){}); 418 | } 419 | 420 | @Override 421 | public List nextTriggerTime(String scheduleType, String scheduleConf) { 422 | HttpRequest httpRequest = getHttpRequest(jobNextTriggerTimePath); 423 | 424 | Map map = new HashMap<>(); 425 | map.put("scheduleType",scheduleType); 426 | map.put("scheduleConf",scheduleConf); 427 | ReturnT> returnT = requestXxlJobAdmin(httpRequest, map,new TypeReference>>(){}); 428 | return returnT.getContent(); 429 | } 430 | 431 | private HttpRequest postHttpRequest(String path) { 432 | String url = new StringBuilder(xxlJobAdminProperties.getAdminUrl()).append(path).toString(); 433 | HttpRequest httpRequest = HttpRequest.post(url); 434 | httpRequest.header(loginHeader.getHeaderName(),loginHeader.getHeaderValue()); 435 | return httpRequest; 436 | } 437 | 438 | private HttpRequest getHttpRequest(String path) { 439 | String url = new StringBuilder(xxlJobAdminProperties.getAdminUrl()).append(path).toString(); 440 | HttpRequest httpRequest = HttpRequest.get(url); 441 | httpRequest.header(loginHeader.getHeaderName(),loginHeader.getHeaderValue()); 442 | return httpRequest; 443 | } 444 | 445 | private T requestXxlJobAdmin(HttpRequest httpRequest, Map paramMap,TypeReference type) { 446 | HttpResponse response = httpRequest.form(paramMap).timeout(timeout).execute(); 447 | int status = response.getStatus(); 448 | String body = response.body(); 449 | log.debug("status:{},body:{}",status,body); 450 | T returnT = JSON.parseObject(body, type); 451 | Assert.isTrue(status == 200, body); 452 | int code = returnT.getCode(); 453 | log.debug("returnT:{}",returnT); 454 | Assert.isTrue(code == 200, returnT.getMsg()); 455 | return returnT; 456 | } 457 | 458 | } 459 | --------------------------------------------------------------------------------