分布式-JOB(XXL-Job)

时间:2019-04-28 18:39:36   收藏:0   阅读:1338

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

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

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

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

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

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

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

 

什么是XXL-JOB:

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

XXL-JOB特性:

 

 

  下载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的使用说明手册。可以很快的搭建起一个自己的任务管理平台

 

原文:https://www.cnblogs.com/920913cheng/p/10756558.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!