springcloud如何使用分布式调度 elasticjob + zookeeper
共 7163字,需浏览 15分钟
·
2021-03-03 10:59
点击上方蓝色字体,选择“标星公众号”
优质文章,第一时间送达
介绍
当一个做定时的服务器崩了以后,另一个服务器将接手继续做定时任务
分布式调度优点:
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 秒
感谢点赞支持下哈