解析Java定时任务的选型及改造问题

目录
  • 【前言】
  • 【比一比&改一改】
    • 一、项目目前定时任务现状
    • 二、Java主流三大定时任务框架优缺点
    • 三、xxl-job一些特性
    • 四、项目中加入xxl-job结合
  • 【总结】

【前言】

项目中用到了定时任务,项目之初为了快速开发上线,当时直接采用最简单的Linux自带的crontab;项目逐渐维定下来时,针对定时任务自己进行了相关研究,并根据项目实际情况进行了对比以及相关改造。

【比一比&改一改】

一、项目目前定时任务现状

1、 使用Linux系统的crontab直接调用Java服务

2、 优缺点:

(1)优点:部署简单,由linux系统维护相对Java进程维护更加维定

(2)缺点:单机部署,风险大;出问题后排错难度大;需要运维介入成本大

(3)总结:针对目前项目情况,弊大于利

二、Java主流三大定时任务框架优缺点

1、 选型时原则:少服务器 后期维护方便 增加任务省事 而且快捷 不涉及启停服务

2、 Quartz

(1)优点:支持集群部署

(2)缺点:没有自带的管理界面;调度逻辑和执行任务耦合在一起;维护需要重启服务

(3)总结:针对目前项目情况,利弊相同

3、 xxl-job

(1)优点:支持集群部署;提供运维界面维护成本小;自带错误预警;相对elastic-job来说不需要额外的组件(zookeeper);支持调度策略;支持分片;

(2)缺点:相对Quartz来说需要多部署调度中心

(3)总结:针对目前项目情况,利大于弊

4、 elastic-job

(1)优点:支持集群部署;维护成本小

(2)缺点:elastic-job需要zookeeper,zookeeper集群高可用至少需要三台服务器

(3)总结:针对目前项目情况,弊大于利

5、 小结:

综合选型原则及三个定时任务框架的优缺点和目前项目的状况,建议选用xxl-job

三、xxl-job一些特性

1、 xxl-job参考资料: https://www.jb51.net/article/234826.htm

2、 一些实用特性:

(1)执行失败可以查看日志

(2)支持邮件报警

(3)路由策略支持轮询等策略,可以减轻执行服务器的压力

(4)轮询时间等参数修改后立即生效

(5)执行器有问题或新增,快速识别

(6)调度中心高可用,调度中心可以集群部署(集群部署的机器时钟必须同步),如果调度中心没有做负载在执行器的配置中需要配多个地址,如果调度中心配置负载则执行器配置负载地址即可

(7)执行器高可用(执行器可以集群部署)

四、项目中加入xxl-job结合

1、 说明:以下Demo以短信发送服务定时任务为例

2、 建议:执行器根据不同的模块建立工程(既方便统一部署又方便升级维护),比如:结算的定时任务可以组成一个工程;短信定时任务可以组成一个工程等

3、 项目中增加xxl-job

(1)在pom中增加依赖

(2)application.properties增加相关配置

(3)增加config解析类

(4)增加执行器

【总结】

在技术选型的时候既要站在当前也要考虑到未来,没有什么是永远的唯一的,要结合具体的场景业务用发展的眼光去看待。

到此这篇关于解析Java定时任务的选型及改造问题的文章就介绍到这了,更多相关java定时任务内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 浅析java中常用的定时任务框架-单体

    目录 一.阅读收获 二.本章源码下载 三.Timer+TimerTask 四.ScheduledExecutorService 五.Spring Task 5.1 单线程串行执行-@Scheduled 5.2 多线程并发运行-@Scheduled+配置定时器的程池(推荐) 5.3 多线程并发执行-@Scheduled+@Async+配置异步线程池 5.4 @Scheduled参数解析 六.Quartz 6.1. 创建任务类 6.2. 配置任务描述和触发器 一.阅读收获 1. 了解常用的单体应用定

  • Java 实现定时任务的三种方法

    是的,不用任何框架,用我们朴素的 Java 编程语言就能实现定时任务. 今天,栈长就介绍 3 种实现方法,教你如何使用 JDK 实现定时任务! 1. sleep 这也是我们最常用的 sleep 休眠大法,不只是当作休眠用,我们还可以利用它很轻松的能实现一个简单的定时任务. 实现逻辑: 新开一个线程,添加一个 for/ while 死循环,然后在死循环里面添加一个 sleep 休眠逻辑,让程序每隔 N 秒休眠再执行一次,这样就达到了一个简单定时任务的效果. 实现代码如下: private stat

  • Java中定时任务的6种实现方式

    目录 1.线程等待实现 2.JDK自带Timer实现 2.1 核心方法 2.2使用示例 2.2.1指定延迟执行一次 2.2.2固定间隔执行 2.2.3固定速率执行 2.3 schedule与scheduleAtFixedRate区别 2.3.1schedule侧重保持间隔时间的稳定 2.3.2scheduleAtFixedRate保持执行频率的稳定 2.4 Timer的缺陷 3.JDK自带ScheduledExecutorService 3.1 scheduleAtFixedRate方法 3.2

  • 解析Java定时任务的选型及改造问题

    目录 [前言] [比一比&改一改] 一.项目目前定时任务现状 二.Java主流三大定时任务框架优缺点 三.xxl-job一些特性 四.项目中加入xxl-job结合 [总结] [前言] 项目中用到了定时任务,项目之初为了快速开发上线,当时直接采用最简单的Linux自带的crontab;项目逐渐维定下来时,针对定时任务自己进行了相关研究,并根据项目实际情况进行了对比以及相关改造. [比一比&改一改] 一.项目目前定时任务现状 1. 使用Linux系统的crontab直接调用Java服务 2.

  • 详解java定时任务

    在我们编程过程中如果需要执行一些简单的定时任务,无须做复杂的控制,我们可以考虑使用JDK中的Timer定时任务来实现.下面LZ就其原理.实例以及Timer缺陷三个方面来解析java Timer定时器. 一.简介       在java中一个完整定时任务需要由Timer.TimerTask两个类来配合完成. API中是这样定义他们的,Timer:一种工具,线程用其安排以后在后台线程中执行的任务.可安排任务执行一次,或者定期重复执行.由TimerTask:Timer 安排为一次执行或重复执行的任务.

  • 解析Java中的定时器及使用定时器制作弹弹球游戏的示例

    在我们编程过程中如果需要执行一些简单的定时任务,无须做复杂的控制,我们可以考虑使用JDK中的Timer定时任务来实现.下面LZ就其原理.实例以及Timer缺陷三个方面来解析java Timer定时器. 一.简介       在java中一个完整定时任务需要由Timer.TimerTask两个类来配合完成. API中是这样定义他们的,Timer:一种工具,线程用其安排以后在后台线程中执行的任务.可安排任务执行一次,或者定期重复执行.由TimerTask:Timer 安排为一次执行或重复执行的任务.

  • 解析Java实现设计模式六大原则之里氏替换原则

    一.什么是里氏替换原则 1.1.里氏替换原则定义 里氏替换原则(Liskov Substitution principle)是对子类型的特别定义的. 为什么叫里氏替换原则呢?因为这项原则最早是在1988年,由麻省理工学院的一位姓里的女士(Barbara Liskov)提出来的. 里氏替换原则有两层定义: 定义1 If S is a subtype of T, then objects of type T may be replaced with objects of type S, withou

  • Java定时任务原理详解

    目录 序章 一.Scheduled 1.1 使用方法 1.2 源码分析 二.QUARTZ 2.1 使用方法 2.2 源码分析 序章 定时任务实现方式 当下,java编码过程中,实现定时任务的方式主要以以下两种为主 spring框架的@Scheduled quzrtz框架 网络上关于这两种框架的实践和配置相关的教程很多,这里不再赘述. 本文主要就二者的框架原理实现做一个入门引导,为了解深层实现细节做一定的铺垫. 本文源码版本 spring-context-3.2.18.RELEASE.jar qu

  • 解析Java编程之Synchronized锁住的对象

    图片上传 密码修改为  synchronized是java中用于同步的关键字,一般我们通过Synchronized锁住一个对象,来进行线程同步.我们需要了解在程序执行过程中,synchronized锁住的到底是哪个对象,否则我们在多线程的程序就有可能出现问题. 看下面的代码,我们定义了一个静态变量n,在run方法中,我们使n增加10,然后在main方法中,我们开辟了100个线程,来执行n增加的操作,如果线程没有并发执行,那么n最后的值应该为1000,显然下面的程序执行完结果不是1000,因为我们

  • 实例解析Java中的构造器初始化

    1.初始化顺序 当Java创建一个对象时,系统先为该对象的所有实例属性分配内存(前提是该类已经被加载过了),接着程序开始对这些实例属性执行初始化,其初始化顺序是:先执行初始化块或声明属性时制定的初始值,再执行构造器里制定的初始值. 在类的内部,变量定义的先后顺序决定了初始化的顺序,即时变量散布于方法定义之间,它们仍就会在任何方法(包括构造器)被调用之前得到初始化. class Window { Window(int maker) { System.out.println("Window(&quo

  • JDK的Parser来解析Java源代码详解

    在JDK中,自带了一套相关的编译API,可以在Java中发起编译流程,解析Java源文件然后获取其语法树,在JDK的tools.jar(OSX下可以在/Library/Java/JavaVirtualMachines/jdk_version/Contents/Home/lib中找到)中包含着这整套API,但是这却不是Oracle和OpenJDK发布中的公开API,因此对于这套API,并没有官方的正式文档来进行说明.但是,也有不少项目利用了这套API来做了不少事情,例如大名鼎鼎的lombok使用了

  • Quartz实现JAVA定时任务的动态配置的方法

    先说点无关本文的问题,这段时间特别的不爽,可能有些同学也遇到过.其实也可以说是小事一桩,但感觉也是不容忽视的.我刚毕业时的公司,每个人每次提交代码都有着严格的规范,像table和space的缩进都有严格的要求,可以说你不遵守开发规范就相当于线上bug问题,还是比较严重的.现在发现外面的公司真的是没那么重视这个不重要却又特别重要的问题啊,啊啊啊啊啊啊!!! 什么是动态配置定时任务? 回归正题,说下这次主题,动态配置.没接触过定时任务的同学可以先看下此篇:JAVA定时任务实现的几种方式 定时任务实现

  • 解析Java 泛型什么情况下不能使用

    一.前言 Java泛型来保证类型安全,防止在运行时发生类型转换异常,让类型参数化,提高了代码的可读性和重用率.但是有些情况下泛型也是不允许使用的,以下是不能使用泛型的一些场景. 二. 什么情况下不能使用Java泛型 1 不能使用泛型的形参创建对象. T o=new T(); // 不允许 2 在泛型类中,不能给静态成员变量定义泛型 Java 中的静态类型随着类加载而实例化,此时泛型的具体类型并没有声明.同时因为静态变量作为所有对象的共享变量,只有类实例化或者方法调用时才能确定其类型.如果是泛型类

随机推荐