1、模块配置文件添加定时器配置
# 分布式定时器配置
xxl:
job:
enable: false # 是否启用自动注册,如果是K8S,IP会变的情况改为true
accessToken: # job admin 配置的token
admin:
addresses: http://192.168.11.123:9057/xxl-job-admin/ # 调度中心地址,生产的话就写生产的内网地址,如下图所示
executor:
appname: infox-masterdata-job #xxljob配置的执行器名称,
ip: #执行器IP,默认为空表示自动获取IP
port: 9999 #xxljob配置的端口号,默认为9999
logretentiondays: -1 #调度中心日志表数据保存天数,过期日志自动清理;限制大于等于7时生效,否则, 如-1,关闭自动清理功能
2、调度中心新增执行器
![在这里插入图片描述](https://img-blog.csdnimg.cn/2019112810333237.png
job-executor-goods 就对应项目模块配置的执行器名称
3、在常量类里定义XXL的配置类
/**
* 定时器
*
* @author JunHao Huang
* @since 2023/9/15 10:17
*/
@Configuration
@ComponentScan(basePackages = "cn.com.infox.masterdata.job")//配置需要扫描的job类
@Slf4j
public class XxlJobConfig {
@Value("${xxl.job.admin.addresses}")
private String adminAddresses;
@Value("${xxl.job.executor.appname}")
private String appName;
@Value("${xxl.job.executor.ip}")
private String ip;
@Value("${xxl.job.executor.port}")
private int port;
@Value("${xxl.job.accessToken}")
private String accessToken;
@Value("${xxl.job.executor.logretentiondays}")
private int logRetentionDays;
@Bean(initMethod = "start", destroyMethod = "destroy")
public XxlJobSpringExecutor xxlJobExecutor() {
log.info(">>>>>>>>>>> xxl-job config init.");
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
xxlJobSpringExecutor.setAppname(appName);
xxlJobSpringExecutor.setIp(ip);
xxlJobSpringExecutor.setPort(port);
xxlJobSpringExecutor.setAccessToken(accessToken);
xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
return xxlJobSpringExecutor;
}
}
4、调度中心新增执行任务
关键红框部分, JobHandler bean name 对应 运行模式中的 JobHandler 名称
5、编写定时任务代码
@Slf4j
@Component
@AllArgsConstructor
public class PersonDimJob extends IJobHandler {
private IPersonDimLogService iPersonDimLogService;
private IPersonService iPersonService;
private ISystemClient iSystemClient;
private RedisUtil redisUtil;
private IFlowApproveClient iFlowApproveClient;
@Override
@XxlJob("PersonDimJob")
@GlobalTransactional(rollbackFor = Exception.class)
public void execute() throws Exception {
Date date = new Date();
List<String> personCodes = iPersonDimLogService.findByDimTime(date);
log.info("自动离职,PersonDimJob开始,时间:{}", DateUtil.format(date, DateUtil.PATTERN_DATE));
if (!CollectionUtil.isEmpty(personCodes)) {
for (String personCode : personCodes) {
log.info("自动离职,时间:{},personCode:{}", DateUtil.format(date, DateUtil.PATTERN_DATE), personCode);
Person person = iPersonService.getPersonByPersonCode(personCode);
//如果person不为空,并且审批流ID不为空
if (ObjectUtil.isNotEmpty(person) && ObjectUtil.isNotEmpty(person.getActFlowRecordId())) {
FlowApproveRecordDTO flowApproveRecordDTO = new FlowApproveRecordDTO();
flowApproveRecordDTO.setId(person.getActFlowRecordId());
FlowApproveRecordVO flowApproveRecordVO = iFlowApproveClient.pageList(flowApproveRecordDTO).getData();
//如果审批流记录不为空
if (ObjectUtil.isNotEmpty(flowApproveRecordVO) && ObjectUtil.isNotEmpty(flowApproveRecordVO.getFlowRecordVoList())) {
List<FlowRecordVO> flowRecordVoList = flowApproveRecordVO.getFlowRecordVoList();
FlowRecordVO flowRecordVO = flowRecordVoList.get(0);
if (ObjectUtil.isNotEmpty(flowRecordVO)) {
String approveUserCode = flowRecordVO.getApproveUserCode();
User user = iSystemClient.getUserByPersonCode(approveUserCode).getData();
//如果能查出来操作人
if (ObjectUtil.isNotEmpty(user)) {
String opUserId = user.getDdUserId();
PromoterDTO promoterDTO = BeanUtil.copyProperties(person, PromoterDTO.class);
String disUserId = iSystemClient.getDdUserIdByMobile(person.getMobile()).getData();
dingdingErr(delandhandover(promoterDTO, disUserId, opUserId));
updatePersonStatusByPersonCode(personCode
, Person.PersonStatusEnum.RESIGNATION.getKey());
dimTUser(promoterDTO);
}
}
}
}
}
}
log.info("自动离职,PersonDimJob结束");
XxlJobHelper.handleSuccess();
}
}
- 1、注解写在类上,所有的方法都会执行。写在方法上,则执行方法;
- 2、注册到Spring容器:添加“@Component”注解,被Spring容器扫描为Bean实例;
- 3、注册到执行器工厂:添加“@XxlJob(value=“自定义jobhandler名称”)”注解,注解value值对应的是调度中心新建任务的JobHandler属性的值。
- 4、执行日志:需要通过 “XxlJobLogger.log” 打印执行日志;
对执行任务来说 返回 new ReturnT(200, msg); code200才认为执行成功 ,msg输出为执行备注。
例子代码位置 cn.weeget.youxuan.goods.job.TestJobHandler
任务执行的调用方法链里都可以加 XxlJobLogger.log 日志,最终输出到调度中心的执行日志
6、启动测试
调度中心操作执行一次,查看任务是否能走通
通过后再开启任务, 注意看任务的下次执行时间