工具篇--分布式定时任务springBoot--elasticjob简单使用(1)

文章目录

  • 前言
  • 一、elasticjob 介绍:
  • 二、elasticjob 使用:
    • 2.1 部署zookeeper:
    • 2.2 引入库
    • 2.2 定义任务:
    • 2.3 任务执行:
    • 2.4 任务执行控制台输出:
  • 三、elasticjob 启动错误:
    • 3.1 KeeperErrorCode = OperationTimeout:
    • 3.2 .HostException: ip is null:
  • 总结


前言

本文对 elasticjob 的简单使用进行介绍。


一、elasticjob 介绍:

ElasticJob 是一个分布式任务调度框架,由当当网开发并开源。它基于 Zookeeper 实现分布式协调,采用经典的分片算法,能够实现弹性扩容和缩容的分布式任务调度。ElasticJob 能够灵活地应用于各种环境中,如易用性、稳定性、弹性可伸缩等方面表现优异。

以下是 ElasticJob 的一些主要特性:

  1. 分布式任务调度:ElasticJob 基于 Zookeeper 实现分布式协调,支持分布式自动负载均衡调度。

  2. 弹性扩缩容:ElasticJob 支持弹性扩容和缩容,在任务节点伸缩时能够自动调整任务分片。

  3. 丰富的定时调度策略:ElasticJob 提供了各种灵活的调度策略,如简单的固定频率、CRON 等。

  4. 支持多种任务处理逻辑:ElasticJob 支持处理数据流、打印日志、脚本处理等多种任务处理逻辑。

  5. 统计和监控:ElasticJob 提供了完善的统计和监控功能,可以监控任务执行状态和运行情况。

总体来说,ElasticJob 是一个功能丰富、可靠且易于集成的分布式任务调度框架,广泛应用于企业系统中的定时任务调度、数据处理等场景。

二、elasticjob 使用:

2.1 部署zookeeper:

因为job需要注册到zk 上,依赖于zk 的leader选举,所以需要先进行zk 的安装;
阿里云轻量服务器–Docker–Zookeeper&Kafka安装;
window Zookeeper zk 启动;

2.2 引入库


<!-- https://mvnrepository.com/artifact/org.apache.shardingsphere.elasticjob/elasticjob-lite-core -->
<!-- 定时任务核心库  -->
<dependency>
   <groupId>org.apache.shardingsphere.elasticjob</groupId>
   <artifactId>elasticjob-lite-core</artifactId>
   <version>3.0.4</version>
   <!--<version>3.0.1</version>-->
</dependency>
<!-- https://mvnrepository.com/artifact/org.yaml/snakeyaml -->
<!-- SnakeYaml用于解析YAML  -->
<dependency>
   <groupId>org.yaml</groupId>
   <artifactId>snakeyaml</artifactId>
   <!--<version>1.27</version>-->
   <version>2.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.codehaus.groovy/groovy-all -->
<!--在程序运行时任意修改代码逻辑  -->
<dependency>
   <groupId>org.codehaus.groovy</groupId>
   <artifactId>groovy-all</artifactId>
   <version>2.4.15</version>
</dependency>

2.2 定义任务:


import lombok.extern.slf4j.Slf4j;
import org.apache.shardingsphere.elasticjob.api.ShardingContext;
import org.apache.shardingsphere.elasticjob.simple.job.SimpleJob;
import org.springframework.stereotype.Component;


@Slf4j
@Component
public class MyJob implements SimpleJob {
    @Override
    public void execute(ShardingContext shardingContext) {

        // 分片参数 0=text,1=image,2=radio,3=vedio
        String  shardingParameter= shardingContext.getShardingParameter();
        String  jobParameter= shardingContext.getJobParameter();

        log.debug("job 执行 error,job名称:{},分片数量:{},分片:{},分片参数:{},jobParamer:{}", shardingContext.getJobName(), shardingContext.getShardingTotalCount(),
                shardingContext.getShardingItem(), shardingParameter,jobParameter);
        if ("text".equals(jobParameter)) {
            // do something by sharding
        }
        switch (shardingContext.getShardingItem()) {
            case 0:
                // do something by sharding item 0
                break;
            case 1:
                // do something by sharding item 1
                break;
            case 2:
                // do something by sharding item 2
                break;
            // case n: ...
        }
    }
}

2.3 任务执行:


import groovy.lang.GroovyShell;
import org.apache.shardingsphere.elasticjob.api.JobConfiguration;
import org.apache.shardingsphere.elasticjob.api.JobExtraConfiguration;
import org.apache.shardingsphere.elasticjob.infra.env.HostException;
import org.apache.shardingsphere.elasticjob.infra.env.IpUtils;
import org.apache.shardingsphere.elasticjob.lite.api.bootstrap.impl.ScheduleJobBootstrap;
import org.apache.shardingsphere.elasticjob.lite.internal.snapshot.SnapshotService;
import org.apache.shardingsphere.elasticjob.reg.base.CoordinatorRegistryCenter;
import org.apache.shardingsphere.elasticjob.reg.zookeeper.ZookeeperConfiguration;
import org.apache.shardingsphere.elasticjob.reg.zookeeper.ZookeeperRegistryCenter;
import org.apache.shardingsphere.elasticjob.tracing.event.JobEvent;
import org.apache.shardingsphere.elasticjob.tracing.event.JobExecutionEvent;
import org.apache.shardingsphere.elasticjob.tracing.event.JobStatusTraceEvent;
import org.springframework.util.StringUtils;


public class MyJobDemo {
    public static void main(String[] args) {
    	// 电脑连接无线网时 连接zk 可能出现ip is null 错误,此时设置一个ip给到zk
        shieldElasticjobIpIsNull();
        // 运行任务
        new ScheduleJobBootstrap(createRegistryCenter(), new MyJob(), createJobConfiguration()).schedule();
    }
	// 配置zookeeper 连接
    private static CoordinatorRegistryCenter createRegistryCenter() {
        ZookeeperConfiguration zookeeperConfiguration = new ZookeeperConfiguration("localhost:2181", "my-job");
        zookeeperConfiguration.setConnectionTimeoutMilliseconds(10000);
        zookeeperConfiguration.setSessionTimeoutMilliseconds(10000);
        zookeeperConfiguration.setMaxSleepTimeMilliseconds(10000);

        CoordinatorRegistryCenter regCenter = new ZookeeperRegistryCenter(zookeeperConfiguration);
        regCenter.init();
        return regCenter;
        // ... 分片参数 分片从0开始到分片总数-1
    }
	// 配置job 运行时机
    private static JobConfiguration createJobConfiguration() {

        // 创建作业配置 
        /**
        * myjob-param job 的名称 同一个zk命名空间下 需要唯一
        * 1 分片个数
        * cron 任务运行的cron 表达式
        * overwrite 运行job 的配置被覆盖写入,默认为false
        * shardingItemParameters  分片参数(随后同 分片个数一同介绍)
        * jobParameter job的参数(job 业务端在执行任务的时候可以接收到该参数)
        **/
        JobConfiguration jobConfiguration = JobConfiguration.newBuilder("myjob-param", 1).cron("0/5 * * * * ?")
                .overwrite(true)
              //  .shardingItemParameters("0=Beijing,1=Shanghai,2=Guangzhou")
                .jobParameter("jobparamer")
                .build();
        return jobConfiguration;

    }

    /**
     * 屏蔽org.apache.shardingsphere.elasticjob.infra.env.IpUtils.getIp()抛出
     * HostException(ip is null) 的异常导致windows本地程序无法启动
     */
    private static void shieldElasticjobIpIsNull(){
        try {
            IpUtils.getIp();
        } catch (HostException e) {
            //抛出HostException 且 异常信息为 "ip is null" 时,设置ip地址为 0.0.0.0
            if("ip is null".equals(e.getMessage())){
                String code = "org.apache.shardingsphere.elasticjob.infra.env.IpUtils.cachedIpAddress=\"0.0.0.0\";";
                GroovyShell groovy = new GroovyShell();
                groovy.evaluate(code);
            }
        }
    }

}

2.4 任务执行控制台输出:

在这里插入图片描述

三、elasticjob 启动错误:

3.1 KeeperErrorCode = OperationTimeout:

在这里插入图片描述
报错位置在 ZookeeperRegistryCenter 的 init() 方法中:
在这里插入图片描述
这里等待一段时间后如果还没有连接到zk 就会报错,默认的等待时间是 3000ms * 3 = 9s ,此时可以考虑增加 maxSleepTimeMilliseconds 的时间:

 private static CoordinatorRegistryCenter createRegistryCenter() {
        ZookeeperConfiguration zookeeperConfiguration = new ZookeeperConfiguration("139.196.92.249:2181", "my-job");
        zookeeperConfiguration.setConnectionTimeoutMilliseconds(10000);
        zookeeperConfiguration.setSessionTimeoutMilliseconds(10000);
        // 增加 maxSleepTimeMilliseconds  时间
        zookeeperConfiguration.setMaxSleepTimeMilliseconds(10000);

        CoordinatorRegistryCenter regCenter = new ZookeeperRegistryCenter(zookeeperConfiguration);
        regCenter.init();
        return regCenter;
        // ... 分片参数 分片从0开始到分片总数-1
    }

3.2 .HostException: ip is null:

在这里插入图片描述

错误代码:
在这里插入图片描述
这里会会获取到本机的ip 进行遍历找到一个符合要求的ip 然后进行返回,如果所有的ip 都不通过,则抛出ip is null 的问题;
处理:引入: groovy-all

<dependency>
    <groupId>org.codehaus.groovy</groupId>
    <artifactId>groovy-all</artifactId>
    <version>2.4.15</version>
</dependency>

编写如下方法,目的只是为了在特殊情况下改变cachedIpAddress的值:

/**
 * 屏蔽org.apache.shardingsphere.elasticjob.infra.env.IpUtils.getIp()抛出
 * HostException(ip is null) 的异常导致windows本地程序无法启动
 */
private static void shieldElasticjobIpIsNull(){
    try {
        IpUtils.getIp();
    } catch (HostException e) {
        //抛出HostException 且 异常信息为 "ip is null" 时,设置ip地址为 0.0.0.0
        if("ip is null".equals(e.getMessage())){
            String code = "org.apache.shardingsphere.elasticjob.infra.env.IpUtils.cachedIpAddress=\"0.0.0.0\";";
            GroovyShell groovy = new GroovyShell();
            groovy.evaluate(code);
        }
    }
}

启动类的main方法内部一开始就调用上面这个shieldElasticjobIpIsNull初始化cachedIpAddress:

public static void main(String[] args) {
 //屏蔽org.apache.shardingsphere.elasticjob.infra.env.IpUtils.getIp()抛出
    //HostException(ip is null) 的异常导致windowes本地程序无法启动的问题
    shieldElasticjobIpIsNull();
    new ScheduleJobBootstrap(createRegistryCenter(), new MyJob(), createJobConfiguration()).schedule();

}

总结

本文对 elasticjob 的简单使用进行介绍。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/458248.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Infineon_TC264智能车代码初探及C语言深度学习(二)

本篇文章记录我在智能车竞赛中&#xff0c;对 Infineon_TC264 这款芯片的底层库函数的学习分析。通过深入地对其库函数进行分析&#xff0c;C语言深入的知识得以再次在编程中呈现和运用。故觉得很有必要在此进行记录分享一下。 目录 ​编辑 一、代码段分析 NO.1 指向结构体…

《恩爱兔》

恩爱兔 类型&#xff1a;休闲跳跃 视角&#xff1a;2d 乐趣点&#xff1a;通过挑战不同的关卡&#xff0c;战胜困难&#xff0c;乐趣无限&#xff0c;运用智慧跳上高台 时间&#xff1a;2019 个人职责&#xff1a; 所有程序部分的设计开发 此游戏是我和朋友独立开发的一款小游戏…

web作业2024.3.15

案例1&#xff1a; 使用CSS行内式为页面元素引入样式。b) 按照CSS样式规则为3号标题设置成微软雅黑、蓝色、26px字体c) 按照CSS样式规则为段落设置成微软雅黑、红色、28px字体。 七步诗 煮豆燃豆萁&#xff0c; 豆在釜中泣。 本是同根生&#xff0c; 相煎何太急。 案例2…

html--bug

文章目录 html html <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>老师</title><style>body {background-color: #008000;margin: 0px;cursor: none;overflow: hidden;}</style></head><bod…

自动开箱机的工作原理与未来发展趋势

随着物流行业的迅猛发展&#xff0c;自动化、智能化的设备逐渐成为行业的新宠。其中&#xff0c;自动开箱机以其高效、精准的特点&#xff0c;受到了广泛关注。星派将详细解析自动开箱机的工作原理&#xff0c;并探讨其未来发展趋势&#xff0c;带领读者一同走进这一先进技术的…

某赛通电子文档安全管理系统 DecryptApplication 任意文件读取漏洞(2024年3月发布)

漏洞简介 某赛通电子文档安全管理系统 DecryptApplication 接口处任意文件读取漏洞&#xff0c;未经身份验证的攻击者利用此漏洞获取系统内部敏感文件信息&#xff0c;导致系统处于极不安全的状态。 漏洞等级高危影响版本*漏洞类型任意文件读取影响范围>1W 产品简介 …

关系代数-练习

设有一个SPJ数据库&#xff0c;包括4个关系模式S、P、J和 SPJ。 S(SNO, SNAME,STATUS,CITY) ; P(PNO,PNAME,COLOR,WEICHT) ; J(JNO,JNAME,CITY); SPJ(SNO,PNO,JNO,QTY)。 供应商表S由供应商代码(SNO)、供应商姓名(SNAME)、供应商状态(STATUS)、供应商…

MySQL查询学生相关信息

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

OSI(Open Systems Interconnection)模型和TCP/IP模型

OSI模型 OSI模型是一个概念模型&#xff0c;由国际标准化组织&#xff08;ISO&#xff09;在1984年提出&#xff0c;用于促进不同系统间的通信互联。OSI模型将网络通信的过程分为七层&#xff0c;每一层都有其特定的功能&#xff0c;从下至上依次是&#xff1a; 物理层&#x…

如何使用第三方接入淘宝商品详情(主图,详情图)

1、找到可用的API接口&#xff1a;首先&#xff0c;需要找到支持查询商品信息的API接口。这些信息通常可以在电商平台的官方文档或开发者门户网站上找到。 2、注册并获取API密钥&#xff1a;在使用API接口之前&#xff0c;需要注册并获取API密钥。API密钥是识别身份的唯一标识符…

springboot学习(八十六) springboot使用graalvm编译native程序

一、windows环境下 1.下载graalvm的jdk https://injdk.cn/ 下载windows版本 配置java环境变量&#xff0c;配置过程略 2.下载visual Studio Build Tools 下载地址&#xff1a;https://aka.ms/vs/17/release/vs_BuildTools.exe 安装后选择组件&#xff1a; 其中windows S…

Java开发从入门到精通(八):Java的面向对象编程OOP:封装、继承、多态

Java大数据开发和安全开发 &#xff08;一&#xff09;Java的封装1.1 什么是封装1.1.1 封装的设计规范1.1.2 代码层面如何控对象的成员公开或隐藏? 1.2 JavaBean(实体类)1.2.1创建实体类1.2.2 实体类有啥应用场景?1.2.3 实体类总结 1.3 static关键字1.3.1 static修饰成员变量…

AI-逻辑回归模型

&#x1f606;&#x1f606;&#x1f606;感谢大家的支持~&#x1f606;&#x1f606;&#x1f606; 逻辑回归的应用场景 逻辑回归&#xff08;Logistic Regression&#xff09;是机器学习中的 一种分类模型 &#xff0c;逻辑回归是一种分类算法&#xff0c;虽然名字中带有回…

中国沈阳综合门户网站建设服务说明(2016年10月23日)

1 宏锦大厦412室 联系电话&#xff1a;***-******38 综合门户网站建设服务说明 中国沉阳 综合门户网站建设服务说明 门户网站策划公司地址&#xff1a;沉河区宏锦万柳塘路36-1号412号楼 联系电话&#xff1a;***-******38 综合门户网站建设服务说明 中国沉阳 海丰科技 联系电话…

当“新质生产力”遇上“CAE仿真”,将激起什么样的火花?

在刚刚闭幕的全国两会上&#xff0c;新质生产力无疑是最为“滚烫”的热词。发展新质生产力是推动高质量发展的内在要求和重要着力点&#xff0c;此次更被列为2024年政府重点任务的第一条。 新质生产力是创新起主导作用&#xff0c;摆脱传统经济增长方式、生产力发展路径&#…

GPT-SoVITS开源音色克隆框架的训练与调试

GPT-SoVITS开源框架的报错与调试 遇到的问题解决办法 GPT-SoVITS是一款创新的跨语言音色克隆工具&#xff0c;同时也是一个非常棒的少样本中文声音克隆项目。 它是是一个开源的TTS项目&#xff0c;只需要1分钟的音频文件就可以克隆声音&#xff0c;支持将汉语、英语、日语三种…

电竞游戏行业有哪些媒体资源?活动发布会如何宣传?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 电竞游戏行业的媒体资源主要包括&#xff1a;游戏门户网站、综合资讯网站、社交媒体平台、电视和网络直播等。 在电竞游戏行业中&#xff0c;媒体资源是丰富多样的。游戏门户网站如游民…

蜜源加入飞桨技术伙伴计划,共同打造“智能导购助手”电商应用新模式

近日&#xff0c;蜜源&#xff08;广州&#xff09;新媒体科技有限公司正式加入飞桨技术伙伴计划&#xff0c;双方将共同努力在电商导购智能化服务领域&#xff0c;创新升级打造“AI导购”新模式。基于大模型赋能电商&#xff0c;持续挖掘出AI电商导购领域的潜力和应用价值&…

pip 配置镜像加速安装

在使用pip安装Python第三方库时&#xff0c;默认是使用pip官网的非常慢&#xff0c;可通过配置国内镜像源加速下载速度&#xff0c;以下是如何使用国内镜像源安装Python库的两种常见方式&#xff1a; 临时使用镜像源安装 如果你只是想临时使用某个镜像源安装单个或几个库&…

『scrapy爬虫』04. 使用管道将数据写入excel(详细注释步骤)

目录 1. excel文件的初始化与保存2. 配置管道使用运行测试总结 欢迎关注 『scrapy爬虫』 专栏&#xff0c;持续更新中 欢迎关注 『scrapy爬虫』 专栏&#xff0c;持续更新中 1. excel文件的初始化与保存 安装操作excel文件的库 pip install openpyxl钩子函数&#xff08;Hook…