分布式任务调度平台xxl-job

135 篇文章 0 订阅

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、启动测试

在这里插入图片描述

调度中心操作执行一次,查看任务是否能走通
通过后再开启任务, 注意看任务的下次执行时间

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值