Apache ShardingSphere ElasticJob 任务开发指南
概述
Apache ShardingSphere ElasticJob 是一个分布式任务调度解决方案,提供了弹性调度、任务分片、分布式协调等功能。本文将详细介绍 ElasticJob 中不同类型的任务开发方式,帮助开发者根据业务需求选择合适的任务类型。
任务类型概览
ElasticJob 提供了两大类任务开发方式:
-
基于类的任务:需要开发者通过实现特定接口来编写业务逻辑
- SimpleJob(简单任务)
- DataflowJob(数据流任务)
-
基于类型的任务:无需编码,仅需提供相应配置即可
- ScriptJob(脚本任务)
- HttpJob(HTTP任务)
基于类的任务开发
1. SimpleJob 简单任务
SimpleJob 是最基础的任务类型,适合执行简单的定时任务逻辑。开发者只需实现 SimpleJob 接口,重写 execute 方法即可。
特点:
- 执行逻辑简单直接
- 支持分片处理
- 适合不需要数据处理的定时任务
示例代码:
public class MySimpleJob implements SimpleJob {
@Override
public void execute(ShardingContext context) {
// 获取分片信息
int shardingItem = context.getShardingItem();
int shardingTotalCount = context.getShardingTotalCount();
// 根据分片执行不同逻辑
switch (shardingItem) {
case 0:
// 处理分片0的数据
processShard0Data();
break;
case 1:
// 处理分片1的数据
processShard1Data();
break;
// 其他分片...
}
}
private void processShard0Data() {
// 具体业务逻辑
}
private void processShard1Data() {
// 具体业务逻辑
}
}
最佳实践:
- 在分片处理时,建议将不同分片的逻辑封装为独立方法
- 可以通过
ShardingContext获取作业名称、分片参数等运行时信息
2. DataflowJob 数据流任务
DataflowJob 专为数据处理场景设计,将任务执行分为数据获取(fetchData)和数据处理(processData)两个阶段。
特点:
- 分离数据获取和处理逻辑
- 支持流式和非流式两种处理模式
- 适合ETL、数据同步等场景
示例代码:
public class MyDataflowJob implements DataflowJob<Order> {
@Override
public List<Order> fetchData(ShardingContext context) {
// 根据分片获取数据
int shardId = context.getShardingItem();
return orderRepository.findPendingOrdersByShard(shardId);
}
@Override
public void processData(ShardingContext context, List<Order> orders) {
// 处理获取到的数据
for (Order order : orders) {
processOrder(order);
orderRepository.markAsProcessed(order.getId());
}
}
private void processOrder(Order order) {
// 订单处理逻辑
}
}
流式处理模式:
通过 streaming.process 属性可控制是否启用流式处理:
- 启用流式处理:任务会持续执行,直到
fetchData返回空数据 - 禁用流式处理:每次任务执行只调用一次
fetchData和processData
注意事项:
- 流式处理时,务必在数据处理完成后更新数据状态,避免重复处理
- 大数据量场景建议分批次处理,避免内存溢出
基于类型的任务开发
1. ScriptJob 脚本任务
ScriptJob 允许直接执行各种脚本(Shell、Python、Perl等),无需编写Java代码。
配置方式:
script.command.line:指定要执行的脚本路径及参数
示例脚本:
#!/bin/bash
# 获取作业运行时信息
echo "分片执行上下文: $*"
执行输出:
分片执行上下文: {"jobName":"orderSyncJob","shardingTotalCount":5,"jobParameter":"","shardingItem":2,"shardingParameter":"shard_param"}
使用场景:
- 已有现成脚本需要调度执行
- 非Java技术栈的业务逻辑
- 快速原型验证
2. HttpJob HTTP任务
HttpJob 通过HTTP协议触发远程服务,适合微服务架构下的任务调度。
核心配置:
http.url:请求地址http.method:请求方法(GET/POST等)http.data:请求数据
示例配置:
JobConfiguration.newBuilder("httpSyncJob", 3)
.setProperty(HttpJobProperties.URI_KEY, "http://api.example.com/sync")
.setProperty(HttpJobProperties.METHOD_KEY, "POST")
.setProperty(HttpJobProperties.DATA_KEY, "type=daily")
.cron("0 0 2 * * ?") // 每天凌晨2点执行
.shardingItemParameters("0=Beijing,1=Shanghai,2=Guangzhou")
.build()
服务端处理:
@RestController
public class JobController {
@PostMapping("/sync")
public void handleJobRequest(
@RequestParam String type,
@RequestParam String shardingContext) {
// 解析分片上下文
ShardingContext context = parseContext(shardingContext);
// 根据type和分片信息处理业务
processSyncTask(type, context.getShardingItem());
}
}
优势:
- 与业务服务解耦
- 支持跨语言调用
- 便于服务治理和监控
任务分片机制
ElasticJob 的分片功能是其核心特性之一,开发者可以通过 ShardingContext 获取分片信息:
public interface ShardingContext {
// 获取作业名称
String getJobName();
// 获取分片总数
int getShardingTotalCount();
// 获取当前分片项
int getShardingItem();
// 获取分片参数
String getShardingParameter();
// 获取作业自定义参数
String getJobParameter();
// 获取任务ID
String getTaskId();
}
分片策略建议:
- 按数据ID哈希分片
- 按地域分片
- 按时间范围分片
- 混合分片策略
自定义任务类型
ElasticJob 支持通过SPI机制扩展自定义任务类型,开发者可以实现 ElasticJob 接口创建符合特定业务需求的任务类型。
扩展步骤:
- 实现
ElasticJob接口 - 创建对应的JobConfiguration配置类
- 通过SPI机制注册实现
总结
Apache ShardingSphere ElasticJob 提供了灵活多样的任务开发方式,开发者可以根据业务场景选择最适合的任务类型:
- 简单定时任务 → SimpleJob
- 数据处理任务 → DataflowJob
- 脚本执行 → ScriptJob
- 服务调用 → HttpJob
合理利用分片功能可以大幅提升任务处理能力,而流式处理模式则为大数据量场景提供了高效解决方案。通过本文的介绍,希望开发者能够更好地利用 ElasticJob 构建健壮、高效的分布式任务调度系统。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



