springcloud如何使用分布式调度 elasticjob + zookeeper

共 7163字,需浏览 15分钟

 ·

2021-03-03 10:59

点击上方蓝色字体,选择“标星公众号”

优质文章,第一时间送达

76套java从入门到精通实战课程分享

介绍

当一个做定时的服务器崩了以后,另一个服务器将接手继续做定时任务

分布式调度优点:


1.单机处理极限:原本1分钟内需要处理1万个订单,但是现在需要1分钟内处理10万个订单;原来一个统计需要1小时,现在业务方需要10分钟就统计出来。你也许会说,你也可以多线程、单机多进程处理。的确,多线程并行处理可以提高单位时间的处理效率,但是单机能力毕竟有限(主要是CPU、内存和磁盘),始终会有单机处理不过来的情况。


2.高可用:单机版的定式任务调度只能在一台机器上运行,如果程序或者系统出现异常就会导致功能不可用。虽然可以在单机程序实现的足够稳定,但始终有机会遇到非程序引起的故障,而这个对于一个系统的核心功能来说是不可接受的。


3.防止重复执行: 在单机模式下,定时任务是没什么问题的。但当我们部署了多台服务,同时又每台服务又有定时任务时,若不进行合理的控制在同一时间,只有一个定时任务启动执行,这时,定时执行的结果就可能存在混乱和错误了


配置

pom.xml

<dependency> <groupId>com.dangdang</groupId> <artifactId>elastic-job-lite-spring</artifactId> <version>2.1.5</version> </dependency>

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.edt</groupId>
    <artifactId>elasticjob</artifactId>
    <version>1.0-SNAPSHOT</version>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
    </parent>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>com.dangdang</groupId>
        <artifactId>elastic-job-lite-spring</artifactId>
        <version>2.1.5</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
</dependencies>
</project>


application.yml

这里的zookeeper设置是自定义的,为了给类使用这里的属性值,解决硬编码问题

zookeeper:

zookeeper:
  host: localhost:2181
  namespace:  springboot-elastic-job-demo
server:
  port: 8082



运行zookeeper服务

将zoo_sample.cfg文件拷贝改名成zoo.cfg

进入bin文件夹,双击运行zkServer.cmd

打开ZooInspector图形化工具 可看zookeeper相关数据

输入cmd命令行开启java -jar zookeeper-dev-ZooInspector.jar


开搞

ZookeeperConfig(配端口等信息连接上zookeeper服务),JobConfiguration(多久定时操作一次,初始化开启定时),MyElasticJob(定时操作的业务)

MyElasticJob

execute方法写定时操作的业务逻辑代码

@Component
public class MyElasticJob implements SimpleJob {

//执行我们定时任务, 比如每隔30分钟就会执行一次execute方法
    public void execute(ShardingContext shardingContext) {
        System.out.println("定时任务开始====>"+new Date());
    }
}


ZookeeperConfig

配置并连接zookeeper服务,端口和空间名引用application.yml中写好的

@Configuration
public class ZookeeperConfig {

    @Bean
    private static CoordinatorRegistryCenter createRegistryCenter(@Value("${zookeeper.host}") String host, @Value("${zookeeper.namespace}") String namespace) {
        //配置zk地址,调度任务的组名
        ZookeeperConfiguration zookeeperConfiguration = new ZookeeperConfiguration(host, namespace);
        zookeeperConfiguration.setSessionTimeoutMilliseconds(100);
        CoordinatorRegistryCenter regCenter = new ZookeeperRegistryCenter(zookeeperConfiguration);
        regCenter.init();
        return regCenter;
    }
}


JobConfiguration

springJobScheduler方法初始化则开始定时操作,在启动类启动的时候则开始了!

@Configuration
public class JobConfiguration {

    @Autowired
    private CoordinatorRegistryCenter coordinatorRegistryCenter;

    @Bean(initMethod = "init")
    public SpringJobScheduler springJobScheduler(MyElasticJob elasticJob){
//        1 执行逻辑操作的类  2 zookeeper配置类的方法  3 定时多久执行业务操作的方法
        return new SpringJobScheduler(elasticJob,coordinatorRegistryCenter,createJobConfiguration(MyElasticJob.class,"0/3 * * * * ?"));
    }

    private static LiteJobConfiguration createJobConfiguration(Class clz,String cron) {
        // 定义作业核心配置
        JobCoreConfiguration simpleCoreConfig = JobCoreConfiguration.newBuilder(clz.getSimpleName(),cron,1).build();
        // 定义SIMPLE类型配置
        SimpleJobConfiguration simpleJobConfig = new SimpleJobConfiguration(simpleCoreConfig, clz.getClass().getCanonicalName());
        // 定义Lite作业根配置
        LiteJobConfiguration simpleJobRootConfig = LiteJobConfiguration.newBuilder(simpleJobConfig).overwrite(true).build();
        return simpleJobRootConfig;
    }
}


效果演示


点击右上角的按钮,即可实现服务多开(开启以后,在application.yml更换端口继续再开)

一开始8081 在定时操作,8082无定时操作

当关掉8081的服务后,8082则开始接盘做定时操作逻辑

————————————————

版权声明:本文为CSDN博主「Edric_豪」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:

https://blog.csdn.net/EDT777/article/details/114238841





粉丝福利:Java从入门到入土学习路线图

👇👇👇

👆长按上方微信二维码 2 秒


感谢点赞支持下哈 

浏览 23
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报