Elastic job:旧版本

50 阅读2分钟

特性

  • 弹性调度:支持分片,弹性伸缩
  • 作业治理:错过的作业重新执行,自动修复
  • 可视化管理:可以在控制台管理Job

整体架构

image-20251116163652517.png

整体开发只需要关注Job相关业务,配置好Job即可。

  • simpleJob:普通作业
  • DataflowJob:处理流式数据,避免数据量过大,每次都先fetch到数据,然后再处理数据,直到fetch没有数据为止。

SimpleJob

maven依赖 : 如果配置有数据库,还需要数据库相关依赖

2.1.5版本有点旧了

        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-client</artifactId>
            <version>2.11.1</version>
        </dependency>
        <dependency>
            <groupId>com.dangdang</groupId>
            <artifactId>elastic-job-lite-core</artifactId>
            <version>2.1.5</version>
        </dependency>

创建job类

public class MyJob implements SimpleJob {
    public void execute(ShardingContext context) {
        System.out.println(
                String.format("分片项 ShardingItem: %s | 运行时间: %s | 线程ID: %s | 分片参数: %s ",
                        context.getShardingItem(),
                        new SimpleDateFormat("HH:mm:ss").format(new Date()),
                        Thread.currentThread().getId(),
                        context.getShardingParameter())
        );
    }
}

配置Job然后启动

 public static void main(String[] args) {
        // ZK注册中心
        CoordinatorRegistryCenter regCenter = new ZookeeperRegistryCenter(
                new ZookeeperConfiguration("192.168.169.223:2181", "ejob-standalone")
        );
        regCenter.init();
​
        // 数据源 , 事件执行持久化策略 : 可以不配
//        DruidDataSource dataSource =new DruidDataSource();
//        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
//        dataSource.setUrl("jdbc:mysql://192.168.169.223:3306/study?useUnicode=true&characterEncoding=utf-8");
//        dataSource.setUsername("root");
//        dataSource.setPassword("Asd456654.");
//        JobEventConfiguration jobEventConfig = new JobEventRdbConfiguration(dataSource);
​
        // 定义作业核心配置
        JobCoreConfiguration coreConfig = JobCoreConfiguration
                .newBuilder("MySimpleJob", "0/5 * * * * ?", 4)
                .shardingItemParameters("0=RDP, 1=CORE, 2=SIMS, 3=ECIF").failover(true).build();
        
        // 定义SIMPLE类型配置
        SimpleJobConfiguration simpleJobConfig = new SimpleJobConfiguration(
                coreConfig, MyJob.class.getCanonicalName());
​
        // 作业分片策略
        // 基于平均分配算法的分片策略
        String jobShardingStrategyClass = AverageAllocationJobShardingStrategy.class.getCanonicalName();
​
        // 定义Lite作业根配置
         LiteJobConfiguration simpleJobRootConfig = LiteJobConfiguration
                 .newBuilder(simpleJobConfig)
                 .jobShardingStrategyClass(jobShardingStrategyClass).build();
        // LiteJobConfiguration simpleJobRootConfig = LiteJobConfiguration.newBuilder(simpleJobConfig).overwrite(true).build();
​
        // 构建Job:多个job就重复创建jobScheduler进行配置
         new JobScheduler(regCenter, simpleJobRootConfig).init();
    }

DataflowJob

  // 初始化代码
    private static void DataFlowJob01(CoordinatorRegistryCenter regCenter) {
        // 定义作业核心配置==>修改cron要么清除zk数据,要么修改jobName
        JobCoreConfiguration coreConfig = JobCoreConfiguration
                .newBuilder("MyDFJob", "0/5 * * * * ?", 4)
                .shardingItemParameters("0=RDP, 1=CORE, 2=SIMS, 3=ECIF").failover(true).build();
​
        DataflowJobConfiguration dataflowJobConfiguration=new DataflowJobConfiguration(
                coreConfig,MyDataflowJob.class.getCanonicalName(),true
        );
​
        // 作业分片策略
        // 基于平均分配算法的分片策略
        String jobShardingStrategyClass = AverageAllocationJobShardingStrategy.class.getCanonicalName();
​
        LiteJobConfiguration dataflowJobRootConfig = LiteJobConfiguration
                .newBuilder(dataflowJobConfiguration)
                .jobShardingStrategyClass(jobShardingStrategyClass).build();
​
        new JobScheduler(regCenter, dataflowJobRootConfig).init();
    }
    @Override
    public List<String> fetchData(ShardingContext context) {
        List<String> foos = new ArrayList<>();
        double random = Math.random();
​
        while (true) {
            if (random > 0.5) {
                foos.add("处理线程:"+Thread.currentThread().getName()+" random:" + random + " 分片:" + context.getShardingItem());
            }else {
                break;
            }
        }
        return foos;
    }
​
    @Override
    public void processData(ShardingContext context, List list) {
        System.out.println("----开始处理数据:"+Thread.currentThread().getName());
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
    }

console : 控制台安装

配置console登录密码

image-20251116164616143.png

启动console

image-20251116164535389.png

界面非常简洁命令:添加配置中心即可,对于namespace相关 image-20251116164812057.png