为什么使用xxl-job,不使用qz:

  • 缺少补偿机制
  • 不支持集群
  • 不支持路由策略
  • 统计任务执行
  • 平台管理
  • 监控,报警邮箱

幂等性:一次请求和多次请求得到相同的结果,不会因为多次的请求,导致最后的数据不同。

现在很多为了保证服务的高可用,一般都采用了集群。例如:在一个商城项目里有这么一个需求,需要每晚12点之前统计每件商品当天的销量,盈利。这时候需要在项目里面加一个任务调度。

在项目上线的时候,会将项目打成war包,部署到不同机器上面的tomcat,服务器一启动,然后定时任务触发的时候,所有服务器上面的定时任务都会同时执行,如何保证集群的时候,定时任务的幂等性。

1.可以使用分布式锁(zk或者reids)

2.可以做成配置文件,例如:有个配置文件,有个变量 true或者false,在项目启动的时候去加载这个配置文件,如果是true就启动任务调度,在部署的时候,只需要设置一台服务器上面的状态是true 其余是false,这样能保证只有一台服务器上面的定时任务是运行的

3.使用分布式任务调度平台

什么是XXL-JOB:

1.XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。

XXL-JOB特性:

  • 1、简单:支持通过Web页面对任务进行CRUD操作,操作简单,一分钟上手;
  • 2、动态:支持动态修改任务状态、暂停/恢复任务,以及终止运行中任务,即时生效;
  • 3、调度中心HA(中心式):调度采用中心式设计,“调度中心”基于集群Quartz实现,可保证调度中心HA;
  • 4、执行器HA(分布式):任务分布式执行,任务"执行器"支持集群部署,可保证任务执行HA;
  • 5、任务Failover:执行器集群部署时,任务路由策略选择"故障转移"情况下调度失败时将会平滑切换执行器进行Failover;
  • 6、一致性:“调度中心”通过DB锁保证集群分布式调度的一致性, 一次任务调度只会触发一次执行;
  • 7、自定义任务参数:支持在线配置调度任务入参,即时生效;
  • 8、调度线程池:调度系统多线程触发调度运行,确保调度精确执行,不被堵塞;
  • 9、弹性扩容缩容:一旦有新执行器机器上线或者下线,下次调度时将会重新分配任务;
  • 10、邮件报警:任务失败时支持邮件报警,支持配置多邮件地址群发报警邮件;
  • 11、状态监控:支持实时监控任务进度;
  • 12、Rolling执行日志:支持在线查看调度结果,并且支持以Rolling方式实时查看执行器输出的完整的执行日志;
  • 13、GLUE:提供Web IDE,支持在线开发任务逻辑代码,动态发布,实时编译生效,省略部署上线的过程。支持30个版本的历史版本回溯。
  • 14、数据加密:调度中心和执行器之间的通讯进行数据加密,提升调度信息安全性;
  • 15、任务依赖:支持配置子任务依赖,当父任务执行结束且执行成功后将会主动触发一次子任务的执行, 多个子任务用逗号分隔;
  • 16、推送maven中央仓库: 将会把最新稳定版推送到maven中央仓库, 方便用户接入和使用;
  • 17、任务注册: 执行器会周期性自动注册任务, 调度中心将会自动发现注册的任务并触发执行。同时,也支持手动录入执行器地址;
  • 18、路由策略:执行器集群部署时提供丰富的路由策略,包括:第一个、最后一个、轮询、随机、一致性HASH、最不经常使用、最近最久未使用、故障转移、忙碌转移等;
  • 19、运行报表:支持实时查看运行数据,如任务数量、调度次数、执行器数量等;以及调度报表,如调度日期分布图,调度成功分布图等;
  • 20、脚本任务:支持以GLUE模式开发和运行脚本任务,包括Shell、Python等类型脚本;
  • 21、阻塞处理策略:调度过于密集执行器来不及处理时的处理策略,策略包括:单机串行(默认)、丢弃后续调度、覆盖之前调度;
  • 22、失败处理策略;调度失败时的处理策略,策略包括:失败告警(默认)、失败重试;
  • 23、分片广播任务:执行器集群部署时,任务路由策略选择"分片广播"情况下,一次任务调度将会广播触发集群中所有执行器执行一次任务,可根据分片参数开发分片任务;
  • 24、动态分片:分片广播任务以执行器为维度进行分片,支持动态扩容执行器集群从而动态增加分片数量,协同进行业务处理;在进行大数据量业务操作时可显著提升任务处理能力和速度。
  • 25、事件触发:除了"Cron方式"和"任务依赖方式"触发任务执行之外,支持基于事件的触发任务方式。调度中心提供触发任务单次执行的API服务,可根据业务事件灵活触发。

  下载XXL-JOB

https://github.com/xuxueli/xxl-job

Download

http://git.oschina.net/xuxueli0323/xxl-job

Download

XXL-JOB项目的工作目录:

  启动xxl-job-admin

1.在数据库新建数据库:xxl-job

2.将xxl-job目录/doc/db/tables_xxl_job.sql导入数据库 创建表如图所示:

3.修改xxl-job-admin 目录下的xxl-job-admin.properties

4.使用tomcat启动xxl-job的管理平台:

5.浏览器输入请求地址:http://localhost:8080/xxl-job-admin/jobgroup

 使用XXL-JOB执行一个任务demo:

下载的XXL-JOB项目提供了各种版本的demo,详细内容可以通过 xxl-job官方文档查看

1 查看xxl-job-executor-sample-springboot 目录下的

2.在xxl-job的管理平台配置处理器和任务:

处理器:执行任务的机器

1.点击管理平台左边的执行管理器编辑按钮:

2.编辑执行器管理:

AppName对应 对应项目中 xxl.job.executor.appname 属性

添加任务:需要执行的逻辑

关于JobHandler的填写必须和程序当中的:JobHander的值一样

分别启动xxl-admin 和xxl-job-executor-sample-springboot 项目 可以看到运行结果如下:

如果在启动xxl-admin以后 还没有来得即启动xxl-job-executor-sample-springboot项目,xxl-admin会报错,这是因为任何job执行都先要在管理平台执行,然后 在由任务管理平台路由到实际的job服务器。

XXL-JOB集群:

 机器地址:192.168.31.215:9999,192.168.31.215:9998 关于端口号 可以自定义

XXL-JOB整合到自己的项目中:

* 开发步骤:

1、继承 “IJobHandler” ;

2、装配到Spring,例如加 “@Service” 注解;

3、加 “@JobHander”
 注解,注解value值为新增任务生成的JobKey的值;多个JobKey用逗号分割;

4、执行日志:需要通过 "XxlJobLogger.log"

 打印执行日志;

1.添加配置文件:

# web port
server.port=8085 # log config
logging.config=classpath:logback.xml # xxl-job
### xxl-job admin address list, such as "http://address" or "http://address01,http://address02"
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin ### xxl-job executor address
xxl.job.executor.appname=testservice1
xxl.job.executor.ip=192.168.31.215
xxl.job.executor.port=9998 ### xxl-job log path
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler/ ### xxl-job, access token
xxl.job.accessToken=

2.添加配置读取文件 XxlJobConfig.java

package com.xxl.job.executor.config;

import com.xxl.job.core.executor.XxlJobExecutor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration; /**
* xxl-job config
*
* @author xuxueli 2017-04-28
*/
@Configuration
@ComponentScan(basePackages = "com.xxl.job.executor.service.jobhandler")
public class XxlJobConfig {
private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class); @Value("${xxl.job.admin.addresses}")
private String addresses; @Value("${xxl.job.executor.appname}")
private String appname; @Value("${xxl.job.executor.ip}")
private String ip; @Value("${xxl.job.executor.port}")
private int port; @Value("${xxl.job.executor.logpath}")
private String logpath; @Value("${xxl.job.accessToken}")
private String accessToken; @Bean(initMethod = "start", destroyMethod = "destroy")
public XxlJobExecutor xxlJobExecutor() {
logger.info(">>>>>>>>>>> xxl-job config init.");
XxlJobExecutor xxlJobExecutor = new XxlJobExecutor();
xxlJobExecutor.setIp(ip);
xxlJobExecutor.setPort(port);
xxlJobExecutor.setAppName(appname);
xxlJobExecutor.setAdminAddresses(addresses);
xxlJobExecutor.setLogPath(logpath);
xxlJobExecutor.setAccessToken(accessToken);
return xxlJobExecutor;
} }

3.编写自己需要执行的事件

package com.xxl.job.executor.jobhandler;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.IJobHandler;
import com.xxl.job.core.handler.annotation.JobHandler; /**
* 任务Handler的一个Demo(Bean模式)
*
* 开发步骤: 1、继承 “IJobHandler” ; 2、装配到Spring,例如加 “@Service” 注解; 3、加 “@JobHander”
* 注解,注解value值为新增任务生成的JobKey的值;多个JobKey用逗号分割; 4、执行日志:需要通过 "XxlJobLogger.log"
* 打印执行日志;
*
* @author xuxueli 2015-12-19 19:43:36
*/
@JobHandler(value = "demoJobHandler")
@Service
public class MySpringbootJobHandler extends IJobHandler {
@Value("${xxl.job.executor.port}")
private String port;
@Value("${server.port}")
private String serverPort; @Override
public ReturnT<String> execute(String arg0) throws Exception {
System.out.println("myJobHandler,port:" + port);
return ReturnT.SUCCESS;
} }

XXL-JOB 是一个容易上手,在下载的项目中有对xxl-job的使用说明手册。可以很快的搭建起一个自己的任务管理平台

分布式-JOB(XXL-Job)的更多相关文章

  1. 转载《分布式任务调度平台XXL-JOB》

    <分布式任务调度平台XXL-JOB>       博文转自 https://www.cnblogs.com/xuxueli/p/5021979.html 一.简介 1.1 概述 XXL-J ...

  2. 分布式任务调度平台XXL-JOB

    <分布式任务调度平台XXL-JOB>       一.简介 1.1 概述 XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是开发迅速.学习简单.轻量级.易扩展.现已开放源代码并 ...

  3. 分布式单点登录框架XXL-SSO

    <分布式单点登录框架XXL-SSO> 一.简介 1.1 概述 XXL-SSO 是一个分布式单点登录框架.只需要登录一次就可以访问所有相互信任的应用系统. 拥有"轻量级.分布式.跨 ...

  4. 分布式消息队列XXL-MQ

    <分布式消息队列XXL-MQ>     一.简介 1.1 概述 XXL-MQ是一款轻量级分布式消息队列,支持串行.并行和广播等多种消息模型.现已开放源代码,开箱即用. 支持三种消息模式: ...

  5. 分布式任务调度——quartz + spring + 数据库

        项目中使用分布式并发部署定时任务,多台跨JVM,按照常理逻辑每个JVM的定时任务会各自运行,这样就会存在问题,多台分布式JVM机器的应用服务同时干活,一个是加重服务负担,另外一个是存在严重的逻 ...

  6. 分布式服务通讯框架XXL-RPC

    <分布式服务通讯框架XXL-RPC>    一.简介 1.1 概述 XXL-RPC 是一个分布式服务通讯框架,提供稳定高性能的RPC远程服务调用功能.现已开放源代码,开箱即用. 1.2 特 ...

  7. 分布式配置管理平台XXL-CONF

    <分布式配置管理平台XXL-CONF>      一.简介 1.1 概述 XXL-CONF 是一个分布式配置管理平台,提供统一的配置管理服务.现已开放源代码,开箱即用. 1.2 特性 1. ...

  8. 分布式任务调度平台XXL-JOB搭建教程

    关于分布式任务调度平台XXL-JOB,其实作者 许雪里 在其发布的中文教程中已经介绍的很清楚了,这里我就不做过多的介绍了,关于其搭建教程,本人依照其文档搭建起来基本上也没遇到啥问题,这里通过博客的形式 ...

  9. 分布式服务框架XXL-RPC

    <分布式服务框架XXL-RPC>      一.简介 1.1 概述 XXL-RPC 是一个分布式服务框架,提供稳定高性能的RPC远程服务调用功能.拥有"高性能.分布式.注册中心. ...

随机推荐

  1. 10/03/2019 PCL-1.8.1 Ubuntu 16.04 boost 1.69 CUDA 9.0 installation

    cmake -DCMAKE_BUILD_TYPE=None -DBUILD_GPU=ON -DBUILD_CUDA=ON -DBUILD_gpu_kinfu=ON -DBUILD_gpu_kinfu_ ...

  2. js string类型时间转换成Date类型

    方法一: var t = "2015-03-16";var array =  t.split("-");var dt = new Date(array[0], ...

  3. 转自CSDN-详述 Java 中的别名现象

    在任何编程语言中,赋值操作都是最常见的操作之一,Java 自然也不例外.赋值时,使用赋值操作符=,它的意思是:“将等号右边的值(右值),复制给左边的值(左值)”.右值可以是任何常数.变量或者表达式(只 ...

  4. 3--TestNG多线程

    第一: 注解方式 public class MultiThreadOnAnnotation{ @test(invocationCount=10,threadPoolSize=10) public vo ...

  5. 推荐一个免费的在线IDE和终端

    墙裂推荐!支持众多语言,方便学习,测试,地址如下 https://www.tutorialspoint.com/codingground.htm

  6. HDU - 6203:ping ping ping (DFS序 贪心)

    pro:给定N+1个点的树,有M对关键点,现在让你破坏最少的点,使得M对关键点不连通. sol:贪心,我们把M对点按照LCA深度排序,每次破坏LCA. 如果一对点(u,v,lca),u-lca-v有点 ...

  7. webservice接口和http接口介绍---更新版

    web service(SOAP)与HTTP接口的区别什么是web service? soap请求是HTTP POST的一个专用版本,遵循一种特殊的xml消息格式Content-type设置为: te ...

  8. rem,em,与px的比较用法

    在Web中使用什么单位来定义页面的字体大小,至今天为止都还在激烈的争论着,有人说PX做为单位好,有人说EM优点多,还有人在说百分比方便,以至于出现了CSS Font-Size: em vs. px v ...

  9. PHP数据库连接mysql与mysqli的区别与用法

    一.mysql与mysqli的概念相关: 1.mysql与mysqli都是php方面的函数集,与mysql数据库关联不大. 2.在php5版本之前,一般是用php的mysql函数去驱动mysql数据库 ...

  10. 安装Scala开发环境

    Scala 介绍 Step 1: 安装 Java开发环境 Scala 版本与Java版本的兼容关系 从Oracle网站下载JDK URL: http://www.oracle.com/technetw ...