一、定时任务实现方式
1、Thread方式
final int timeInterval = 1000;
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while (true){
try {
//每一秒执行一次
Thread.sleep(timeInterval);
System.out.println("run...");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
thread.start();
2、timer方式
//timer方式
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("run1...");
}
},1000,2000);//1s后执行 每2s执行一次
3、线程池方式
ScheduledExecutorService scheduled = Executors.newScheduledThreadPool(10);
scheduled.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println("run3....");
}
}, 1, 3, TimeUnit.SECONDS);
4、quarzt
Springboot整合定时任务_程序三两行的博客-CSDN博客
二、分布式调用服务elastic-job
分布式环境下运行定时任务就是分布式调度,同一个任务可能会执行多次,可以通过分布式锁或者zk选举执行解决,对于这种分布式调度出现了调度框架xxl-job,elastic-job等
1、elastic-job概述
Elastic-Job是当当网开源的一个分布式调度解决方案,基于Quartz二次开发的,由两个相互独立的子项目Elastic-Job-Lite和Elastic-Job-Cloud组成。
Elastic-Job-Lite,它定位为轻量级无中心 化解决方案,使用Jar包的形式提供分布式任务的协调服务,而Elastic-Job-Cloud子项目需要结合Mesos以及Docker在云环境下使用。
Elastic-Job的github地址: https://github.com/elasticjob
备注:此项目目前已经捐赠以apache,新的项目地址是
https://github.com/apache/shardingsphere-elasticjob
官网地址:ElasticJob - Distributed scheduled job solution
最新版本是 3.0.1
主要功能介绍
- 分布式调度协调:在分布式环境中,任务能够按指定的调度策略执行,并且能够避免同一任务多实例重复执行
- 丰富的调度策略:基于成熟的定时任务作业框架Quartz cron表达式执行定时任务
- 弹性扩容缩容:当集群中增加某一个实例,它应当也能够被选举并执行任务;当集群减少一个实例时,它所执行的任务能被转移到别的实例来执行。
- 失效转移:某实例在任务执行失败后,会被转移到其他实例执行
- 错过执行作业重触发:若因某种原因导致作业错过执行,自动记录错过执行的作业,并在上次作业 完成后自动触发。
- 支持并行调度:支持任务分片,任务分片是指将一个任务分为多个小任务项在多个实例同时执行。 作业分片一致性 当任务被分片后,保证同一分片在分布式环境中仅一个执行实例。
2、本地部署web界面
下载仓库代码,这里版本是2.1.5,cmd进入D:\idea_workspace\shardingsphere-elasticjob-2.1.5\elastic-job-lite
打包
mvn clean install -Dmaven.test.skip=true
进入
D:\idea_workspace\shardingsphere-elasticjob-2.1.5\elastic-job-lite\elastic-job-lite-console\target
解压刚才打包的压缩包,解压后进入bin目录执行start.bat即可部署
3、入门程序
这里还是使用2版本
首先本地搭建zk环境,zk3.4.6以上版本,查看zk文章 ZooKeeper_程序三两行的博客-CSDN博客_zookeeper版本选择
创建maven项目 导入依赖
<dependency>
<groupId>com.dangdang</groupId>
<artifactId>elastic-job-lite-core</artifactId>
<version>2.1.5</version>
</dependency>
测试业务方法
/**
* 定义任务类实现SimpleJob即可,实现execute方法
*/
public class MyTask implements SimpleJob {
@Override
public void execute(ShardingContext shardingContext) {
System.out.println("业务方法开始执行===============");
}
}
执行
public class App {
//zk
private final static String ZK = "localhost:2181";
//调度任务命名空间 zk中会自动创建的节点
private final static String NAME_SPACE = "my_job";
public static void main(String[] args) {
startJob(zkConfig());
}
//任务启动和配置
public static void startJob(CoordinatorRegistryCenter registryCenter) {
//参数String jobName job名称, String cron job表达式, int shardingTotalCount分片数
JobCoreConfiguration jobCoreConfiguration = JobCoreConfiguration.newBuilder("test-job", "0/3 * * * * ?", 3).build();
SimpleJobConfiguration jobConfiguration = new SimpleJobConfiguration(jobCoreConfiguration, MyTask.class.getCanonicalName());
//启动任务 注册中心
new JobScheduler(registryCenter, LiteJobConfiguration.newBuilder(jobConfiguration).overwrite(true).build()).init();
}
//zk配置以及创建注册中心
public static CoordinatorRegistryCenter zkConfig() {
//注册中心zk配置
ZookeeperConfiguration zookeeperConfiguration = new ZookeeperConfiguration(ZK, NAME_SPACE);
//减少zk超时时间
zookeeperConfiguration.setSessionTimeoutMilliseconds(100);
//创建注册中心
ZookeeperRegistryCenter registryCenter = new ZookeeperRegistryCenter(zookeeperConfiguration);
registryCenter.init();
return registryCenter;
}
}
4、架构
三、Sringboot整合elastic-job
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.6.8</version>
</dependency>
<dependency>
<groupId>com.dangdang</groupId>
<artifactId>elastic-job-lite-spring</artifactId>
<version>2.1.5</version>
</dependency>
Elastic-Job生态总结
Elastic-Job Spring Boot 自动集成,只需要一个注解即可发布Job
https://github.com/longfeizheng/elastic-job-spring-boot-starter
elastic-job UI管理界面
https://gitee.com/yuejuncheng/elastic-job-lite-console
Elastic-job运维平台
https://www.aliyundrive.com/s/sM6YWTmGRc4
https://www.bilibili.com/read/cv15848011?from=note
推荐文章
Welcome to leave your article link (欢迎留下关于 ElasticJob 的文章链接) · Issue #1854 · apache/shardingsphere-elasticjob · GitHub
分布式调度问题及解决方案_灯塔下的守望者的博客-CSDN博客_分布式调度解决方案