elastic是一个定时任务库

https://shardingsphere.apache.org/elasticjob/index_zh.html

项目结构

​依赖

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

实现simplejob

simplejob是使用最多、最简单的定时任务

任务类

定时任务类需要实现相应的定时任务接口(idea快捷键 ctrl+i)

public class MySimpleJob implements SimpleJob

然后在实现的execute里写定时任务的逻辑

public class MySimpleJob implements SimpleJob {@Overridepublic void execute(ShardingContext shardingContext) {System.out.println("分片项: " + shardingContext.getShardingItem() +",总分片项数: " + shardingContext.getShardingTotalCount());}
}

定时任务配置

新建App.java

public class App {
} 

添加配置信息(都写在App.java里)

1)zookeeper配置信息(zookeeper作为注册中心,elasticjob将服务注册到zookeeper)

zookeeper搭建可以看我的这一篇文章

在windows搭建zookeeper(单机/集群) - 知乎
    /*** 注册中心zookeeper*/public static CoordinatorRegistryCenter zkCenter() {// 参数1: zk的地址(集群就写多个,中间用逗号隔开),参数2: 命名空间var zc =new ZookeeperConfiguration("localhost:2181", "java-simple-job");var crc = new ZookeeperRegistryCenter(zc);// 初始化注册中心crc.init();return crc;}

2)simplejob任务配置

    /*** simple-job配置** @return*/public static LiteJobConfiguration configurationSimple() {// 1,job核心配置var jcc = JobCoreConfiguration// 参数1: 任务名称,参数2: cron表达式(0/10 -> 10秒执行一次),参数3: 分片项数量.newBuilder("mySimpleJob", "0/10 * * * * ?", 2).build();// 2,job类型配置// 参数1: 核心配置,参数2: 任务类的全类名var jtc = new SimpleJobConfiguration(jcc, MySimpleJob.class.getCanonicalName());// 3,job根配置 (LiteJobConfiguration)return LiteJobConfiguration.newBuilder(jtc)// 有这个才能重新布置任务,否则修改不会生效.overwrite(true).build();}

3)启动定时任务

    public static void main(String[] args) {// 启动定时任务// 参数1: 注册中心;参数2: 配置new JobScheduler(zkCenter(), configurationSimple()).init();}

启动

因为我们设置的分片数量是2,所以可以启动另一个定时任务,elasticjob会自动分配任务

复制运行配置

启动两个任务,可以看到自动分配任务,原本是一个服务执行分片1和0,现在是分别执行单个任务

dataflow任务

dataflow任务适合处理流式作业,和simplejob不同,分为数据抓取和处理,先获取数据然后进行处理

订单类(被处理的类)

public class Order {private Integer orderId;// 0 未处理; 1 已处理private Integer status;@Overridepublic String toString() {return "Order{" +"orderId=" + orderId +", status=" + status +'}';}public Integer getOrderId() {return orderId;}public void setOrderId(Integer orderId) {this.orderId = orderId;}public Integer getStatus() {return status;}public void setStatus(Integer status) {this.status = status;}
}

任务类

实现接口,有两个方法,对应抓取和处理,抓取方法的返回值会交给处理方法

public class MyDataflowJob implements DataflowJob<Order> { // 抓取数据@Overridepublic List<Order> fetchData(ShardingContext shardingContext) {return null;}// 处理数据@Overridepublic void processData(ShardingContext shardingContext, List<Order> data) { }
} 

具体逻辑:初始化100个order,然后抓取指定数据(status为0 并且 订单号%分片总数 == 当前分片项)的订单进行处理,返回值交给处理方法,处理方法进行处理(将order的status设置为1)

public class MyDataflowJob implements DataflowJob<Order> {private List<Order> orders = new ArrayList<Order>();{// 实例化该类时执行for (int i = 0; i < 100; i++) {Order order = new Order();order.setOrderId(i + 1);// 未处理order.setStatus(0);orders.add(order);}}// 抓取数据@Overridepublic List<Order> fetchData(ShardingContext shardingContext) {// 将 订单号%分片总数 == 当前分片项 的订单进行处理var orderList = orders.stream()// 过滤状态为0的.filter(o -> o.getStatus() == 0).filter(o -> o.getOrderId() % shardingContext.getShardingTotalCount()== shardingContext.getShardingItem())// 放入集合.collect(toList());List<Order> subList = null;if (orderList != null && orderList.size() > 0) {// (抓)截取listsubList = orderList.subList(0, 10);}try {// 休眠3秒Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}LocalTime time = LocalTime.now();System.out.println(time + "我是分片项: " + shardingContext.getShardingItem() + ",我抓取的数据是: " + subList);return subList;}// 处理数据@Overridepublic void processData(ShardingContext shardingContext, List<Order> data) {// 设置为已处理,下次不会再抓取到data.forEach(o -> o.setStatus(1));try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}LocalTime time = LocalTime.now();System.out.println(time + "我是分片项: " + shardingContext.getShardingItem() + ",正在处理数据!");}
}

App.java

1)dataflow任务配置

   /*** dataflow-job配置** @return*/public static LiteJobConfiguration configurationDataflow() {// 1,job核心配置var jcc = JobCoreConfiguration// 参数1: 任务名称,参数2: cron表达式(0/10 -> 10秒执行一次),参数3: 分片项数量.newBuilder("myDataflowJob", "0/10 * * * * ?", 2).build();// 2,job类型配置// 参数1: 核心配置,参数2: 任务类的全类名,参数3: 是否开启定时任务(不开则只执行1次)var jtc =new DataflowJobConfiguration(jcc, MyDataflowJob.class.getCanonicalName(), true);// 3,job根配置 (LiteJobConfiguration)return LiteJobConfiguration.newBuilder(jtc)// 有这个才能重新布置任务,否则修改不会生效.overwrite(true).build();}

2)main方法

    public static void main(String[] args) {// 启动定时任务// 参数1: 注册中心;参数2: 配置new JobScheduler(zkCenter(), configurationDataflow()).init();}

启动

script任务

可以运行脚本文件(cmd、python……)

d盘下新建test.txt,修改内容后重命名为.cmd

%1这些是用来接收elastic传递来的参数的

echo running cmd cript: %1,%2,%3,%4,%5

App.java

1)任务配置

    /*** script-job配置** @return*/public static LiteJobConfiguration configurationScript() {// 1,job核心配置var jcc = JobCoreConfiguration// 参数1: 任务名称,参数2: cron表达式(0/10 -> 10秒执行一次),参数3: 分片项数量.newBuilder("myScriptJob", "0/10 * * * * ?", 2).build();// 2,job类型配置// 参数1: 核心配置,参数2: 任务脚本所在目录var jtc =new ScriptJobConfiguration(jcc, "d:/test.cmd");// 3,job根配置 (LiteJobConfiguration)return LiteJobConfiguration.newBuilder(jtc)// 有这个才能重新布置任务,否则修改不会生效.overwrite(true).build();}

2)main方法

    public static void main(String[] args) {// 启动定时任务// 参数1: 注册中心;参数2: 配置new JobScheduler(zkCenter(), configurationScript()).init();}

后续更文:springboot整合(2.1.5和3.0.0-alpha)

Java使用elasticjob实现定时任务(v2.1.5)相关推荐

  1. java.lang.NoClassDefFoundError: com/mchange/v2/ser/Indirector解决方法

    java.lang.NoClassDefFoundError: com/mchange/v2/ser/Indirector解决方法 错误描述:java.lang.NoClassDefFoundErro ...

  2. 使用c3p0数据库连接池连接时出现错误:java.lang.NoClassDefFoundError: com/mchange/v2/ser/Indirector

    连接时出现如下错误: java.lang.NoClassDefFoundError: com/mchange/v2/ser/Indirector 解决方案: 导入c3p0的jar包之后还应导入: mc ...

  3. java timertask 定时_Java定时任务--Timer和TimerTask

    1.程序和编程 我们知道,计算机程序是一组计算机能识别和执行的指令,运行于电子计算机上,满足人们某种需求的信息化工具. 简单来说程序在本质上是指令的集合,而编程从字面上来讲就是编写这些指令集合(程序) ...

  4. Java实现调用Udesk API v2(二)

    作者:张振琦 前篇介绍了API v2 如何调用,本篇以获取工单列表接口为例,介绍如果使用Java调用Udesk的API v2接口.先看一下获取工单列表接口的说明: 注:完整的接口说明请参考Udesk官 ...

  5. C3P0连接池使用时报错java.lang.NoClassDefFoundError: com/mchange/v2/ser/Indirector

    今天学习连接池的时候,导入了c3p0-0.9.5.2.jar,然后进行实例化使用 @Testpublic void test2() throws SQLException {ComboPooledDa ...

  6. elastic-job 有没有java 接口去触发定时任务执行

    maven引入: <dependency><groupId>com.dangdang</groupId><artifactId>elastic-job- ...

  7. java一定时间间隔的定时任务_Java 定时任务---Timer

    本文来自我一个朋友的个人博客(希望各位以后多多支持):https://www.liupeng.mobi/archives/777 一.Timer类 在java中一个完整的定时任务需要由Timer和Ti ...

  8. corn java 可配置_定时任务工具——CronUtil

    牢骚 Java中定时任务使用的最多的我想就是quartz了,但是这个框架太过庞大,而且我也不需要用到这么多东西,使用方法也是比较复杂(官方Demo我实在是无语--).于是我便寻找新的框架代替(不要问我 ...

  9. Spring boot 集成 Elastic-job 实现定时任务

    1. 介绍 当前主流的分布式任务调度: feature quartz elastic-job xxl-job antares opencron 依赖 mysql jdk1.7+, zookeeper ...

最新文章

  1. java安全沙箱(二)之.class文件检验器
  2. 【计算机IO系列零】应用软件部分
  3. Web前端要学什么语言?需掌握哪些知识?
  4. 一键 linux桌面安装vnc,Ubuntu 16.04 LTS一键安装VNC
  5. 群晖218 修改服务器名称,一次换群晖引发的各种事情——论如何榨干218+的价值【不完全版】...
  6. Spring.io本地服务器解决超时问题
  7. (三)2005年我的第一次软件行业创业,烧掉30万、2年时间打水漂的惨痛教训
  8. 【MyBatis笔记】16-多对多关系建表
  9. java值类型和引用类型的区别
  10. 2018.07.25 bzoj2125: 最短路(圆方树+倍增)
  11. Angular 2 Decorators - 2
  12. 测试人员常用的20个Linux命令(附Linux视频教程)
  13. Reflex.XTR-ISO 1CD(模型模拟飞行器)
  14. 每日新闻丨工信部发布绿色数据中心技术产品目录;阿里巴巴核心系统100%上云;苹果产品路线图曝光...
  15. 南京软件测试女薪资2019,2019年第一扎!南京最新平均工资最新出炉,看完不敢过年!...
  16. 自动适配跳转电脑PC端和手机WAP端
  17. 考研数据结构之数组(5.1)——练习题之移动数组所有非零元素到数组前端(C表示)
  18. 【MT19937】学习分析
  19. 联合证券|滴滴出行即日起恢复!A股嗨了!券商扛起领涨大旗
  20. K8S污点taint的声明语法、污点的设置、查看和去除

热门文章

  1. 《世界因你不同:李开复自传》引言:从心选择
  2. 超文本标记语言主要通过Html,11.HTML中文译为“超文本标记语言”,主要是通过HTML标记对网页中的( )等内容进行描述。...
  3. CNVD-2021-49104——泛微E-Office文件上传漏洞
  4. 泛微的流程数据都保存在数据库了,但是页面显示不全,只显示一点数据
  5. 怎么还原xp系统里的服务器,xp怎么还原电脑网络设置
  6. COOX基础培训之二次开发(一)
  7. DICOM3.0标准梳理
  8. 工业界开源和学术界开源的差异和一种设想的转化方式
  9. nessus在kali中的安装与详细使用
  10. 使用python构建数据库_使用Python构建一个极简主义博客(或者,如何学习停止烦恼和热爱Web开发)。