文章目录

  • 介绍
  • 配置
  • pom.xml
  • application.yml
  • 运行zookeeper服务
  • 开搞
  • MyElasticJob
  • ZookeeperConfig
  • JobConfiguration
  • 效果演示


介绍

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

分布式调度优点:

  • 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:
  host: localhost:2181
  namespace:  springboot-elastic-job-demo
server:
  port: 8082

运行zookeeper服务

  • zoo_sample.cfg文件拷贝改名成zoo.cfg
  • spring boot分布式定时任务 springcloud分布式定时任务_spring


  • 进入bin文件夹,双击运行zkServer.cmd
  • spring boot分布式定时任务 springcloud分布式定时任务_elasticjob_02


  • 打开ZooInspector图形化工具 可看zookeeper相关数据
  • 输入cmd命令行开启java -jar zookeeper-dev-ZooInspector.jar

spring boot分布式定时任务 springcloud分布式定时任务_elasticjob_03

开搞

  • 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;
    }
}

效果演示

spring boot分布式定时任务 springcloud分布式定时任务_spring boot分布式定时任务_04

  • 点击右上角的按钮,即可实现服务多开(开启以后,在application.yml更换端口继续再开)
  • 一开始8081 在定时操作,8082无定时操作
  • 当关掉8081的服务后,8082则开始接盘做定时操作逻辑