👉项目官网: 官网入口
👉Gitee仓库: Gitee仓库入口
👉GitHub仓库: Github仓库入口
有一个场景,需要每天凌晨1点执行一次统计任务,一般情况下是使用分布式锁(Redis、ZK、MySQL)等方式,保证同一时刻只有一个任务执行。整个应用中如果有多个这类任务则需要重复维护,如果扩大到整个公司的业务来看,效率将是低下的,并且以下诉求很难得到满足:
对于多业务线的企业,只需要部署一套任务调度平台,即可支撑多业务接入,且业务线权限之间互不干扰。
管理后台提供更多维度的日志详情,能够帮助用户更好的理解任务的执行情况,并且能够更好的排查问题。
<!--
同时提供有Gradle等各类依赖类型
https://mvnrepository.com/artifact/cn.horace.cronjob/cronjob-executor
-->
<dependency>
<groupId>cn.horace.cronjob</groupId>
<artifactId>cronjob-executor</artifactId>
<version>最新版本</version>
</dependency>
/**
* 演示任务
* Created in 2025-01-01 10:44.
*
* @author Horace
*/
@TaskConfig(name = "普通测试任务", cron = "* * * * * ? ", routerStrategy = RouterStrategy.RANDOM)
public class DemoCronTask implements TaskHandler {
private static final Logger logger = LoggerFactory.getLogger(DemoCronTask.class);
/**
* 执行任务的方法
*
* @param params 任务参数
* @return 任务执行结果,如果执行成功,则返回HandlerResult.success(),如果执行失败,则返回HandlerResult.fail(),返回null,也判定是失败
*/
@Override
public HandlerResult handle(TaskParams params) {
logger.info("task handler..., params:{}", params);
Random random = new Random();
int delay = random.nextInt(50);
LockSupport.parkNanos(TimeUnit.MILLISECONDS.toNanos(delay));
return HandlerResult.success();
}
}
/**
* 示例执行器
* <p>
* * @author Horace
*/
public class ExampleExecutor {
private static final Logger logger = LoggerFactory.getLogger(ExampleExecutor.class);
public static void main(String[] args) {
ArrayList<Object> taskObjects = new ArrayList<>();
taskObjects.add(new DemoCronTask());
ExecutorConfig config = ExecutorConfig.Builder.newBuilder(taskObjects)
.address("http://127.0.0.1:9527")
.tenant("horace")
.appName("example-executor")
.appDesc("普通示例执行器")
.tag("common")
.signKey("7d890a079948b196756rtf5452d2245t")
.build();
CronJobExecutorClient.init(config).start();
}
}
<!--
同时提供有Gradle等各类依赖类型
https://mvnrepository.com/artifact/cn.horace.cronjob/cronjob-executor-starter
-->
<dependency>
<groupId>cn.horace.cronjob</groupId>
<artifactId>cronjob-executor-starter</artifactId>
<version>最新版本</version>
</dependency>
/**
* 演示任务
*
* @author Horace
*/
@Component
@TaskConfig(name = "Spring测试任务", cron = "* * * * * ? ", routerStrategy = RouterStrategy.RANDOM)
public class DemoCronTask implements TaskHandler {
private static final Logger logger = LoggerFactory.getLogger(DemoCronTask.class);
/**
* 执行任务的方法
*
* @param params 任务参数
* @return 任务执行结果,如果执行成功,则返回HandlerResult.success(),如果执行失败,则返回HandlerResult.fail(),返回null,也判定是失败
*/
@Override
public HandlerResult handle(TaskParams params) {
logger.info("task handler..., params:{}", params);
Random random = new Random();
int delay = random.nextInt(200);
LockSupport.parkNanos(TimeUnit.MILLISECONDS.toNanos(delay));
return HandlerResult.success();
}
}
注意:这里的任务类一定要打上Spring的注解,可以是@Component,把对象实例交给Spring管理。
/**
* Created in 2025-01-01 21:00.
*
* @author Horace
*/
@Configuration
public class AppConfig {
private static final Logger logger = LoggerFactory.getLogger(AppConfig.class);
/**
* 自定义配置
*
* @return
*/
@Bean
public ExecutorStarterConfig cronJobExecutorStarterConfig() {
ExecutorStarterConfig config = new ExecutorStarterConfig();
config.setAddress("http://127.0.0.1:9527");
config.setTenant("horace");
config.setAppName("example-executor-starter");
config.setAppDesc("Spring示例执行器");
config.setTag("common");
config.setSignKey("7d890a079948b196756rtf5452d2245t");
return config;
}
}
/**
* Created in 2025-01-01 21:00.
*
* @author Horace
*/
@EnableCronJob
@SpringBootApplication
public class ExampleSpringExecutor {
private static final Logger logger = LoggerFactory.getLogger(ExampleSpringExecutor.class);
public static void main(String[] args) {
SpringApplication.run(ExampleSpringExecutor.class, args);
}
}
注意:需要在启动类上加上@EnableCronJob注解,开启CronJob的自动配置。
放一张调度平台首页的图片~
👉项目官网: 官网入口
👉Gitee仓库: Gitee仓库入口
👉GitHub仓库: Github仓库入口
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。