热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于分布式:开源分布式任务调度工具和你一起记住生命中每一个重要的时刻

SandGlass⏳SandGlass是一款为java设计的分布式任务调度工具。创作目标定时工作是业务需要中十分常见的比方:(1)每天给本人爱人发晚安什么你还是独身?,那看完本篇文章就有了。(2)每个月告诉本人要还信用卡可能还有其余的手机费、生活费之类的,反正又是一个没钱的一个月。(3)每个月14日都是情人节这个扯远
SandGlass

⏳ SandGlass 是一款为 java 设计的分布式任务调度工具。

创作目标

定时工作是业务需要中十分常见的

比方:

(1)每天给本人爱人发晚安

什么你还是独身?,那看完本篇文章就有了。

(2)每个月告诉本人要还信用卡

可能还有其余的手机费、生活费之类的,反正又是一个没钱的一个月。

(3)每个月 14 日都是情人节

这个扯远了……

有了场景,那咱们如何实现呢?

java 已有的实现任务调度的支流工具如下:

名称 多线程执行 cron 表达式 应用难度 可独立 spring 运行 工作执行等长久化 分布式反对
Timer 简略 需本人实现
ScheduledExecutor 个别 需本人实现
Quartz 麻烦 较差
Spring Schedule 简略
Sandglass 简略

为什么须要从新实现一个任务调度框架呢?

老马的日常开发中,简略的调度工作会应用 jdk 中的 ScheduledExecutor 实现。

当波及到 cron 表达式时,个别会应用 quartz,毕竟老牌调度框架,性能十分欠缺。

然而比照 spring schedule,quartz 的应用就显得有些麻烦,须要开发者指定较多的配置。

那间接应用 spring schedule 不就好了吗?

spring schedule 的毛病也很显著,不反对数据的长久化,不反对散布式调度。

那间接引入一个分布式任务调度零碎呢?

有时候就显得杀鸡用牛刀,而且保护老本比拟高。

读到这里,必定会有聪慧的小伙伴们提问了:“难道就不能写一个能够独立于 spring 应用,又能够整合 spring 应用,能够单机调度,又能够散布式调度的任务调度工具吗?”

是的,sandglass 就是一个渐进式,满足下面各种利用场景的任务调度工具

sandglass 的一点改良

  • sandglass 领有 quartz 的弱小性能,spring schedule 的应用便捷性。
  • sandglass 的实现简洁,便于零碎学习调度零碎的原理。
  • sandglass 基于分布式理念设计,便于作为散布式调度零碎的实现基石。
  • sandglass 所有实现都是基于接口,用户能够自定义实现本人的策略。

个性

  • 高性能任务调度
  • 反对工作 MIS-FIRE 解决策略
  • 反对工作是否并发解决
  • 反对不依赖 spring,齐全独立运行
  • 反对整合 spring
  • 反对整合 springboot
  • 反对用户高度自定义
  • 真正意义上的分布式任务调度零碎
  • 从零开始纯自研调度框架,便于用户学习原理
疾速开始

maven 引入


    com.github.houbb
    sandglass-core
    1.7.1

入门例子

测试代码

//1.1 定义工作
IJob job = new AbstractJob() {
    @Override
    public void execute(IJobContext context) {
        LOG.info("HELLO");
    }
};

//1.2 定义触发器
ITrigger trigger = new CronTrigger("*/5 * * * * ?");

//2. 执行
SandGlassHelper.schedule(job, trigger);

日志输入

依据 cron 表达式,5s 执行一次工作。

[INFO] [2021-12-07 21:47:40.008] [pool-1-thread-1] [c.g.h.s.c.u.SandGlassHelperTest.doExecute] - HELLO
[INFO] [2021-12-07 21:47:45.003] [pool-1-thread-2] [c.g.h.s.c.u.SandGlassHelperTest.doExecute] - HELLO
[INFO] [2021-12-07 21:47:50.005] [pool-1-thread-3] [c.g.h.s.c.u.SandGlassHelperTest.doExecute] - HELLO
Trigger 触发器

cron

通过 cron 表达式创立 trigger,能够通过办法:

Triggers.cron(String cronExpression);

period

通过指定工夫距离创立 trigger,应用办法:

Triggers.period(long period);
Triggers.period(long period, TimeUnit timeUnit);
疏导类

阐明

SandGlass 也反对疏导类自定义,默认配置等价于:

SandGlassBs.newInstance()
        .appName(SandGlassConst.DEFAULT_APP_NAME)
        .envName(SandGlassConst.DEFAULT_ENV_NAME)
        .machineIp(SandGlassConst.DEFAULT_MACHINE_IP)
        .machinePort(SandGlassConst.DEFAULT_MACHINE_PORT)
        .workPoolSize(SandGlassConst.DEFAULT_WORKER_POOL_SIZE)
        .waitTakeTimeSleepMills(SandGlassConst.WAIT_TAKE_TIME_SLEEP_MILLS)
        .triggerLockTryMills(SandGlassConst.TRIGGER_LOCK_TRY_MILLS)
        .triggerStore(new TriggerStore())
        .triggerDetailStore(new TriggerDetailStore())
        .triggerListener(new TriggerListener())
        .triggerLock(Locks.none())
        .triggerIdGenerator(IdGenerators.classSlim())
        .triggerLockKeyGenerator(new TriggerLockKeyGenerator())
        .jobStore(new JobStore())
        .jobDetailStore(new JobDetailStore())
        .jobListener(new JobListener())
        .jobTriggerStore(new JobTriggerStore())
        .jobTriggerStoreListener(new JobTriggerStoreListener())
        .jobTriggerMappingStore(new JobTriggerMappingStore())
        .jobTriggerNextTakeTimeStore(new JobTriggerNextTakeTimeStore())
        .jobIdGenerator(IdGenerators.classSlim())
        .taskLogStore(new TaskLogStore())
        .timer(SystemTimer.getInstance())
        .scheduleListener(new ScheduleListener())
        .start();

所有实现都是基于接口,用于能够依据理论业务进行调整。

属性阐明

可配置的属性列表如下:

属性 阐明 默认值
appName 利用名称
envName 环境名称
machineIp 机器IP
machinePort 机器端口
workPoolSize 工作线程池大小
waitTakeTimeSleepMills 期待 takeTime 时,每一次循环的暂停工夫
triggerLockTryMills trigger 锁尝试获取工夫
triggerStore 触发器长久化
triggerDetailStore 触发器详情信息长久化
triggerListener 触发器监听器
triggerLock 触发器锁
triggerLockKeyGenerator 触发调度锁 key 生成策略
triggerIdGenerator 触发器标识生成策略
jobStore 工作长久化
jobDetailStore 工作详情长久化
jobListener 工作执行监听器
jobIdGenerator 工作标识生成策略
jobTriggerStore 工作触发器长久化
jobTriggerStoreListener 工作登程长久化监听器
jobTriggerMappingStore 工作触发器映射关系长久化
jobTriggerNextTakeTimeStore 工作触发下一次获取工夫长久化
taskLogStore 工作执行日志长久化
timer 工夫策略
scheduleListener 任务调度监听器
spring 整合

maven 引入


    com.github.houbb
    sandglass-spring
    1.7.1

定时工作定义

相似于 spring 的任务调度,咱们能够通过注解指定办法。

@Service
public class MyJobService {

    @PeriodSchedule(period = 2000)
    public void logTime() {
        System.out.println("---------------- TIME");
    }

    @CronSchedule("*/5 * * * * ?")
    public void logName() {
        System.out.println("---------------- NAME");
    }

}

@PeriodSchedule 用于指定 period 执行的工作,@CronSchedule 用于指定 cron 表达式对应的工作。

@PeriodSchedule 注解

用于指定基于 period 执行的工作办法。

可配置属性列表如下:

属性 阐明 类型 默认值
value 调度距离 long –
timeUnit 调度间隔时间单位 TimeUnit TimeUnit.MILLISECONDS
initialDelay 初始化延迟时间 long 0
fixedRate 是否固定速率 boolean false
allowConcurrentExecute 是否容许并发执行 boolean true
remark 备注 String

@CronSchedule 注解

用于指定基于 cron 表达式 执行的工作办法。

可配置属性列表如下:

属性 阐明 类型 默认值
value cron 表达式 String –
allowConcurrentExecute 是否容许并发执行 boolean true
remark 备注 String

定时工作启用

间接指定 @EnableSandGlass 注解即可,无需额定配置。

@Configurable
@ComponentScan(basePackages = "com.github.houbb.sandglass.test.spring")
@EnableSandGlass
public class SpringConfig {
}

注解其定义

@EnableSandGlass 容许用户进行自定义。

可配置的属性列表如下:

属性 阐明 默认值
appName 利用名称
workPoolSize 工作线程池大小
waitTakeTimeSleepMills 期待 takeTime 时,每一次循环的暂停工夫
triggerLockTryMills trigger 锁尝试获取工夫
triggerStore 触发器长久化
triggerDetailStore 触发器详情信息长久化
triggerListener 触发器监听器
triggerLock 触发器锁
triggerLockKeyGenerator 触发调度锁 key 生成策略
triggerIdGenerator 触发器标识生成策略
jobStore 工作长久化
jobDetailStore 工作详情长久化
jobListener 工作执行监听器
jobIdGenerator 工作标识生成策略
jobTriggerStore 工作触发器长久化
jobTriggerStoreListener 工作登程长久化监听器
jobTriggerMappingStore 工作触发器映射关系长久化
jobTriggerNextTakeTimeStore 工作触发下一次获取工夫长久化
taskLogStore 工作执行日志长久化
timer 工夫策略
scheduleListener 任务调度监听器

默认的策略和 SandglassBs 疏导类保持一致。

自定义形式:实现对应接口,在注解中对应对应的 bean 名称即可。

阐明:上面 3 个属性和业务无关,只和执行的环境的配置无关,所以不反对注解指定。能够通过配置自定义。

属性 配置属性名称 阐明
envName sandglass-envName 配置指定环境信息
machineIp sandglass-machineIp 配置指定机器IP信息
machinePort sandglass-machinePort 配置指定机器端口信息
springboot 整合

maven 引入


    com.github.houbb
    sandglass-springboot-starter
    1.7.1

其余什么都不须要,就能够相似 spring 整合一样应用定时工作了。

办法定义

同 spring 整合

模块介绍

子模块

sandglass 共计 5 个子模块:

名称 阐明 作用
sandglass-api 接口模块 定义规范
sandglass-core 外围模块 外围实现,可齐全独立 spring 运行
sandglass-spring spring 模块 整合 spring,便于应用
sandglass-springboot-starter springboot 模块 整合 springboot,便于应用
sandglass-test 测试模块 功能测试,便于用户编写用例参考

采纳渐进式的 MVP 设计理念,根本能够满足日常开发中的常见场景。

当然,分布式的任务调度服务会简单的多,将会以 sandglass 为根底进行拓展实现。

产品矩阵

常言道,独木不成林。

sandglass 作为一个任务调度外围实现,只是分布式任务调度的基石。

若要实现一个残缺的散布式调度零碎,还须要如下的工具撑持。

名称 阐明 状态
sandglass 外围实现 已开源
sandglass-socket 底层通信协定 未开源
sandglass-client 任务调度客户端 未开源
sandglass-web 任务调度控台 未开源

目前经验几十个迭代和几十个不眠的夜晚,基本功能实现实现,后续思考陆续开源。

拓展浏览 开源地址

为了便于大家独特学习,开源地址如下:

https://github.com/houbb/sandglass

https://gitee.com/houbinbin/sandglass

文章

为了吃瓜通宵7天写了一个网站

开源分布式任务调度工具,和你一起记住生命中每一个重要的时刻


推荐阅读
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • springmvc学习笔记(十):控制器业务方法中通过注解实现封装Javabean接收表单提交的数据
    本文介绍了在springmvc学习笔记系列的第十篇中,控制器的业务方法中如何通过注解实现封装Javabean来接收表单提交的数据。同时还讨论了当有多个注册表单且字段完全相同时,如何将其交给同一个控制器处理。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • 如何在文本中运行Java程序
    本文介绍了在文本中运行Java程序的步骤,包括创建文本文档、修改后缀、打开DOS命令窗口、编译和运行程序。通过这些步骤,可以在文本中成功运行Java程序并输出结果。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
  • 开发笔记:spring boot项目打成war包部署到服务器的步骤与注意事项
    本文介绍了将spring boot项目打成war包并部署到服务器的步骤与注意事项。通过本文的学习,读者可以了解到如何将spring boot项目打包成war包,并成功地部署到服务器上。 ... [详细]
  • 微信官方授权及获取OpenId的方法,服务器通过SpringBoot实现
    主要步骤:前端获取到code(wx.login),传入服务器服务器通过参数AppID和AppSecret访问官方接口,获取到OpenId ... [详细]
  • Java如何导入和导出Excel文件的方法和步骤详解
    本文详细介绍了在SpringBoot中使用Java导入和导出Excel文件的方法和步骤,包括添加操作Excel的依赖、自定义注解等。文章还提供了示例代码,并将代码上传至GitHub供访问。 ... [详细]
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
  • 本文介绍了在Go语言中可见性与scope的规则,包括在函数内外声明的可见性、命名规范和命名风格,以及变量声明和短变量声明的语法。同时,还介绍了变量的生命周期,包括包级别变量和局部变量的生命周期,以及变量在堆和栈上分配的规则和逃逸分析的概念。 ... [详细]
  • 本文整理了Java中org.apache.hadoop.hive.ql.plan.ExprNodeColumnDesc.getTypeInfo()方法的一些代码示例,展 ... [详细]
author-avatar
Cockroach小小强
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有