Apache ShardingSphere ElasticJob Java API 使用指南
概述
Apache ShardingSphere ElasticJob 是一个分布式任务调度解决方案,提供了弹性调度、任务分片、故障转移等高级功能。本文将详细介绍如何使用 ElasticJob 的 Java API 来配置和运行分布式任务。
任务配置
ElasticJob 采用构建器模式创建任务配置对象,这种方式使得配置更加清晰和灵活。以下是一个典型配置示例:
JobConfiguration jobConfig = JobConfiguration.newBuilder("myJob", 3)
.cron("0/5 * * * * ?")
.shardingItemParameters("0=Beijing,1=Shanghai,2=Guangzhou")
.build();
关键配置项说明:
myJob
:任务名称,需唯一标识3
:分片总数,表示任务将被分成3个分片执行cron
:定时表达式,控制任务执行时间shardingItemParameters
:分片参数,可为每个分片指定不同参数
任务启动方式
ElasticJob 提供两种任务调度模式:定时调度和一次性调度。
定时调度实现
定时调度会按照配置的 cron 表达式周期性地执行任务:
public class JobDemo {
public static void main(String[] args) {
// 基于类的定时调度
new ScheduleJobBootstrap(createRegistryCenter(), new MyJob(), createJobConfiguration()).schedule();
// 基于类型的定时调度
new ScheduleJobBootstrap(createRegistryCenter(), "MY_TYPE", createJobConfiguration()).schedule();
}
private static CoordinatorRegistryCenter createRegistryCenter() {
// 创建注册中心配置
ZookeeperConfiguration zkConfig = new ZookeeperConfiguration("zk_host:2181", "elastic-job-demo");
CoordinatorRegistryCenter regCenter = new ZookeeperRegistryCenter(zkConfig);
regCenter.init();
return regCenter;
}
}
一次性调度实现
一次性调度适合需要手动触发的任务场景:
public class JobDemo {
public static void main(String[] args) {
OneOffJobBootstrap jobBootstrap = new OneOffJobBootstrap(
createRegistryCenter(),
new MyJob(),
createJobConfiguration()
);
// 可多次调用执行
jobBootstrap.execute();
}
}
任务诊断功能
在生产环境中,分布式任务的问题往往难以直接调试。ElasticJob 提供了 dump 命令来导出任务运行时信息:
public class JobMain {
public static void main(final String[] args) {
// 开启监听端口9888用于dump诊断
SnapshotService snapshotService = new SnapshotService(regCenter, 9888).listen();
}
}
使用该功能后,可以通过指定端口获取任务运行时状态,便于问题排查。
错误处理策略
ElasticJob 提供了多种错误处理策略,开发者可以根据业务需求选择合适的策略:
内置策略对比
| 策略名称 | 描述 | 是否内置 | 是否默认 | 需要额外配置 | |---------|------|---------|---------|-------------| | 日志策略 | 记录错误日志不中断任务 | 是 | 是 | 否 | | 抛出策略 | 抛出异常中断任务 | 是 | 否 | 否 | | 忽略策略 | 忽略异常不中断任务 | 是 | 否 | 否 | | 邮件通知 | 发送邮件通知不中断任务 | 否 | 否 | 是 | | 企业微信通知 | 发送企业微信通知不中断任务 | 否 | 否 | 是 | | 钉钉通知 | 发送钉钉通知不中断任务 | 否 | 否 | 是 |
策略实现示例
日志策略(默认)
JobConfiguration.newBuilder("myJob", 3)
.cron("0/5 * * * * ?")
.jobErrorHandlerType("LOG")
.build();
邮件通知策略
首先添加 Maven 依赖:
<dependency>
<groupId>org.apache.shardingsphere.elasticjob</groupId>
<artifactId>elasticjob-error-handler-email</artifactId>
<version>${latest.version}</version>
</dependency>
然后配置任务:
JobConfiguration jobConfig = JobConfiguration.newBuilder("myJob", 3)
.jobErrorHandlerType("EMAIL")
.build();
// 设置邮件服务器配置
jobConfig.getProps().setProperty("host", "smtp.example.com");
jobConfig.getProps().setProperty("port", "465");
// 其他必要配置...
钉钉通知策略
添加依赖:
<dependency>
<groupId>org.apache.shardingsphere.elasticjob</groupId>
<artifactId>elasticjob-error-handler-dingtalk</artifactId>
<version>${latest.version}</version>
</dependency>
配置任务:
JobConfiguration jobConfig = JobConfiguration.newBuilder("myJob", 3)
.jobErrorHandlerType("DINGTALK")
.build();
// 设置钉钉机器人配置
jobConfig.getProps().setProperty("webhook", "your_webhook_url");
jobConfig.getProps().setProperty("secret", "your_secret");
最佳实践建议
- 注册中心配置:生产环境建议使用集群模式的 Zookeeper,确保高可用
- 分片策略:合理设置分片数量,通常与执行节点数量成比例关系
- 错误处理:关键业务建议使用通知类策略,非关键业务可使用日志策略
- 任务命名:采用有意义的命名,便于后期维护和监控
- 参数配置:充分利用分片参数实现数据分区处理
通过本文的介绍,开发者应该能够掌握 ElasticJob Java API 的基本使用方法,并能够根据实际业务需求配置合适的任务调度策略。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考