springboot集成elastic job分布式任务调度-Apache版本尝鲜

***********************************************************************************************************************************

当当开源的elastic job分布式任务调度已于202008进入Apache基金会,下面来试玩一下它的Apache版本

参考:官方文档     github源码    作者发的通告   优秀文章

***********************************************************************************************************************************

       单机任务调度可能存在系统性能瓶颈,应用多实例部署可能出现同一时间多个相同定时任务(虽然可分布式锁解决),试看elastic job分布式任务调度能否解决这些痛点?详细功能列表

  • 分布式调度协调
  • 弹性扩容缩容
  • 失效转移
  • 错过执行作业重触发
  • 作业分片一致性,保证同一分片在分布式环境中仅一个执行实例
  • 自诊断并修复分布式不稳定造成的问题
  • 支持并行调度
  • 支持作业生命周期操作
  • 丰富的作业类型
  • Spring整合以及命名空间提供
  • 运维平台

  基本架构

      

1.依赖

        <dependency>
            <groupId>org.apache.shardingsphere.elasticjob</groupId>
            <artifactId>elasticjob-lite-spring-boot-starter</artifactId>
            <version>3.0.0-alpha</version>
        </dependency>

2.配置

这里配置了四个类型的job,copy于github项目examples->elasticjob-example-lite-springboot的配置文件.关于分片项参数:shardingItemParameters: 0=Beijing,1=Shanghai,2=Guangzhou  我的理解:0,1,2是分片索引,对应每个应用实例,value则为每个分片(每个实例)独有的参数,用于义务判断等。

elasticjob:
  tracing:
    type: RDB
  regCenter:
    serverLists: zookeeper地址 #快速安装docker run --privileged=true --name zookeeper -p  2181:2181  -d zookeeper:latest
    namespace: elasticjob-lite
  jobs:
    simpleJob:
      elasticJobClass: org.apache.shardingsphere.elasticjob.simple.job.SimpleJob
      cron: 0/5 * * * * ?
      shardingTotalCount: 2
      shardingItemParameters: 0=Beijing,1=Shanghai,2=Guangzhou
    dataflowJob:
      elasticJobClass: org.apache.shardingsphere.elasticjob.dataflow.job.DataflowJob
      cron: 0/5 * * * * ?
      shardingTotalCount: 2
      shardingItemParameters: 0=Beijing,1=Shanghai,2=Guangzhou
    scriptJob:
      elasticJobType: SCRIPT
      cron: 0/10 * * * * ?
      shardingTotalCount: 2
      props:
        script.command.line: "echo SCRIPT Job: "
    manualScriptJob:
      elasticJobType: SCRIPT
      jobBootstrapBeanName: manualScriptJobBean
      shardingTotalCount: 2
      props:
        script.command.line: "echo Manual SCRIPT Job: "
  dump:
    port: 8888

3.SimleJob /DataflowJob

@Component
@Slf4j
public class SpringBootDataflowJob implements DataflowJob<User> {
    
    @Override
    public List<User> fetchData(final ShardingContext shardingContext) {
        log.info("Item: {} | Time: {} | Thread: {} | {},detail:{}",
        shardingContext.getShardingItem(), new SimpleDateFormat("HH:mm:ss").format(new Date()), Thread.currentThread().getId(), "DATAFLOW FETCH",shardingContext);
        return null;
    }
    
    @Override
    public void processData(final ShardingContext shardingContext, final List<User> data) {
        log.info("Item: {} | Time: {} | Thread: {} | {},detail:{}",
        shardingContext.getShardingItem(), new SimpleDateFormat("HH:mm:ss").format(new Date()), Thread.currentThread().getId(), "DATAFLOW PROCESS",shardingContext);

    }
}
@Component
@Slf4j
public class SpringBootSimpleJob implements SimpleJob {

    @Override
    public void execute(ShardingContext shardingContext) {
        log.info("Item: {} | Time: {} | Thread: {} | {},detail:{}",
                shardingContext.getShardingItem(), new SimpleDateFormat("HH:mm:ss").format(new Date()), Thread.currentThread().getId(), "SIMPLE",shardingContext);

    }
}

4.基本测试

这里有个坑,本地win7启动 IpUtils类报错:ip is null ,win8 win10没测试,Linux没问题,已提issue。jar -jar 启动一个实例,可见配置的任务数2,两个shard 0,1都在执行

同一主机再启动一个实例进行,Java -jar -Dserver.port=xxxx 再启动一个实例,通过日志任务调度已重新分配

这样:beijing 和shanghai分别在两个实例。如需要把北京上海的用户遍历处理进行一些复杂业务处理,就可以将shardingParameter作为SQL参数。

 

//TODO 待官方修复后bug后测试其它功能

 

 

 

 

 

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值