当前项目是基于SpringCloud,服务注册中心(eurake,nacos...)进行任务调度的思路。
目前完成的功能有:任务自动注册,任务统一管理,集中调度,支持多种路由规则(可拓展),任务调度日志,轻量级无需依赖quartz。
分布式任务调度和单体应用的任务调度的区别在于,通过将任务集中统一管理,无需每一个微服务都维护自己的任务。下面通过一个简单的示例来看看分布式任务调度的构建流程。
主要分为两大部分任务管理组件,和任务执行组件(都可以通过水平拓容来增加服务的容错性稳定性)
示例代码:https://github.com/awyFamily/nc-job.git
1.新建数据库ncjob,执行初始化文件(resource/init/init.sql)
2.如果是基于eurake,则在pom文件中引用eurake client依赖,yml加入eurake配置【nacos同理】
3.更改yml文件中数据库配置信息
4.运行启动类
5.添加测试任务(需要先启动example项目)
6.立即执行测试
执行测试类,或请求url: localhost:9999/jobInfo/running/1
响应:被立即执行了
7.日志输出
1.引入依赖包
com.awyFamily
nc-job-core
${nc.job.version}
2.yml文件加入配置
#任务配置
nc:
job:
provider:
#服务实例名(当前执行器)
jobServerId: nc-job-example
#任务包路径
taskPackagePath: com.yhw.nc.job.example.handler
3.增加配置类(主要作用扫描包)
@EnableFeignClients(JobCommonConstant.ADMIN_FEIGN_REMOTE_PATH)
@ComponentScan(JobCommonConstant.JOB_SCAN_PACKAGE_PATH)
@Configuration
public class NcJobConfig {
}
4.开始编写第一个任务,在taskPackagePath包下新建任务,注意getName方法的值必须唯一,否则会导致重名任务找不到的情况
import cn.hutool.core.date.DatePattern;
import com.yhw.nc.job.core.provied.AbstractNcTask;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
@Slf4j
@Component
public class TestNcTask extends AbstractNcTask {
@Override
protected void run(Integer jobId, String parameter) {
log.info("开始运行了:".concat(LocalDateTime.now().format(DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN))));
}
@Override
protected String getName() {
return "测试任务";
}
}
5.运行启动类
启动后会自动注册任务的数据库:
如图所示:
1
2
基于nacos实现:https://github.com/sunboy1/nacos_cloud.git
springboot单机版,基于quartz : https://github.com/sunboy1/quartz.git
想要了解分布式调度更多的信息请关注: https://github.com/xuxueli/xxl-job