elastic-job--作业类型

elastic-job提供了三种类型的作业:

  1. Simple类型作业
    SimpleJob需要实现SimpleJob接口,意为简单实现,未经过任何封装,与quartz原生接口相似,比如示例代码中所使用的job。
  2. Dataflow类型作业
    Dataflow类型用于处理数据流,需实现DataflowJob接口。该接口提供2个方法可供覆盖,分别用于抓取(fetchData)和处理(processData)数据。可通过DataflowJobConfiguration配置是否流式处理。流式处理数据只有fetchData方法的返回值为null或集合长度为空时,作业才停止抓取,否则作业将一直运行下去; 非流式处理数据则只会在每次作业执行过程中执行一次fetchData方法和processData方法,随即完成本次作业。实际开发中,Dataflow类型的job还是很有好用的
  3. Script类型作业
    Script类型作业意为脚本类型作业,支持shell,python,perl等所有类型脚本,使用不多,可以参见github文档。

1.流式作业

1.1 流式作业接口
/**
 * 数据流分布式作业接口.
 * 
 * @author zhangliang
 * 
 * @param <T> 数据类型
 */
public interface DataflowJob<T> extends ElasticJob {

    /**
     * 获取待处理数据.
     *
     * @param shardingContext 分片上下文
     * @return 待处理的数据集合
     */
    List<T> fetchData(ShardingContext shardingContext);

    /**
     * 处理数据.
     *
     * @param shardingContext 分片上下文
     * @param data 待处理数据集合
     */
    void processData(ShardingContext shardingContext, List<T> data);
}

当作业配置为流式的时候,每次触发作业后会调度一次fetchData获取数据,如果获取到了数据会调度processData方法处理数据,处理完后又继续调fetchData获取数据,再调processData处理,如此循环,就像流水一样。直到fetchData没有获取到数据或者发生了重新分片才会停止。

public class MyDataflowJob implements DataflowJob<String> {

    private static final ThreadLocal<Integer> LOOP_COUNTER = new ThreadLocal<>();
    private static final int LOOP_TIMES = 10;//每次获取流处理循环次数
    private static final AtomicInteger COUNTER = new AtomicInteger(1);//计数器

    @Override
    public List<String> fetchData(ShardingContext shardingContext) {
        Integer current = LOOP_COUNTER.get();
        if (current == null) {
            current = 1;
        } else {
            current += 1;
        }
        LOOP_COUNTER.set(current);
        System.out.println(Thread.currentThread() + "------------current--------" + current);
        if (current > LOOP_TIMES) {
            System.out.println("\n\n\n\n");
            return null;
        } else {
            int shardingItem = shardingContext.getShardingItem();
            List<String> datas = Arrays.asList(getData(shardingItem), getData(shardingItem), getData(shardingItem));
            return datas;
        }
    }

    private String getData(int shardingItem) {
        return shardingItem + "-" + COUNTER.getAndIncrement();
    }

    @Override
    public void processData(ShardingContext shardingContext, List<String> data) {
        System.out.println(Thread.currentThread() + "--------" +data);
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值