分布式任务调度解决方案

分布式任务调度解决方案

一、xxl-job

1、引入xxl-job-core依赖


<dependency>
   <groupId>com.xuxueligroupId>
   <artifactId>xxl-job-coreartifactId>
   <version>2.3.0version>
dependency>

2、配置文件

#xxljob
#调度中心服务地址
xxl.job.admin.addresses = http://172.xxx.xxx.xxx:8080/xxl-job-admin
#调度中心密钥,非空则启用
xxl.job.accessToken =
#执行器地址,填写以后可以在调度中心手动填写执行器地址
xxl.job.executor.address =
#执行器端口
xxl.job.executor.port = 9998
#日志保存位置
xxl.job.executor.logpath = /data/applogs/xxl-job/jobhandler
#日志保存时间,最少3天,否则不启用
xxl.job.executor.logretentiondays = 7

3、配置类

import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author liuyf
 * @description: xxl-job config
 * @date: 2021/12/16 11:20
 */
@Configuration
public class XxlJobConfig {

    @Value("${xxl.job.admin.addresses}")
    private String adminAddresses;

    @Value("${xxl.job.accessToken}")
    private String accessToken;

    @Value("${spring.application.name}")
    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.executor.logretentiondays}")
    private int logRetentionDays;

    @Bean
    public XxlJobSpringExecutor xxlJobExecutor() {
        XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
        xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
        xxlJobSpringExecutor.setAppname(appname);
        xxlJobSpringExecutor.setIp(ip);
        xxlJobSpringExecutor.setPort(port);
        xxlJobSpringExecutor.setAccessToken(accessToken);
        xxlJobSpringExecutor.setLogPath(logPath);
        xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
        return xxlJobSpringExecutor;
    }
}

4、执行器任务

4.1、BEAN

/**
 * @author liuyf
 * @description: 执行器任务中心
 * @date: 2021/12/16 11:20
 */
@Slf4j
@Component
public class JijJobCentre {
    
    @Value("${job.used}")
    private boolean cronUsed;
    
	@XxlJob("jobName")
    public void jobName(){
        try {
            log.info("job:jobName start");
            if(!cronUsed){
                log.info("当前为外网服务,不做定时任务,jobName end");
                return;
            }
            System.out.println("job:jobName executor successful");
        }catch (Exception e){
            log.error("job:jobName error:{}",e.getMessage());
        }
        log.info("job:jobName end");
    }
}

4.2、GLUE(JAVA)

package com.xxl.job.service.handler;

import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.IJobHandler;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class Demo extends IJobHandler {

    @Override
    public void execute() throws Exception {

        String result = null;
        InputStream input = null;
        String uri ="";
        try {
            String param = XxlJobHelper.getJobParam();
            uri = param;//传进来的参数
            URL url = new URL(uri);
            HttpURLConnection urlcon = (HttpURLConnection) url.openConnection();
            urlcon.setRequestMethod("GET");
            urlcon.connect();// 获取连接
            input = urlcon.getInputStream();
            BufferedReader buffer = new BufferedReader(new InputStreamReader(
                    input, "UTF-8"));
            StringBuffer bs = new StringBuffer();
            String line = null;
            while ((line = buffer.readLine()) != null) {
                bs.append(line);
            }
            result = bs.toString();
        } catch (Exception e) {
            System.out.println("[请求异常][地址:" + uri + "][错误信息:" + e.getMessage() + "]");
        }
    }

}

5、调度中心配置

​ 1)启动xxl-job-admin服务,进入任务调度中心(ip:port/xxl-job-admin,用户名admin,密码123456)

​ 2)执行器管理->新增执行器,AppName为spring.application.name,选择自动注册模式,如果指定服务的ip和端口可以进行手动录入。保存后可以在OnLine机器地址里查看注册的服务。

​ 3)任务管理->新增任务。调度类型选择CRON,运行模式选择BEAN,JobHandler填写执行器任务中心的@XxlJob值。

6、其他

配置 可选项 说明
调度类型 固定速度 输入Second轮询
CRON 按照CRON表达式执行
运行模式 BEAN 按照执行器任务中心的@XxlJob任务来执行
GLUD(*) 按照写入的任务代码来执行
路由策略 第一个 当选择该策略时,会选择执行器注册地址的第一台机器执行,如果第一台机器出现故障,则调度任务失败。
最后一个 当选择该策略时,会选择执行器注册地址的最后一台机器执行,如果最后一台机器出现故障,则调度任务失败。
轮询 当选择该策略时,会按照执行器注册地址轮询分配任务,如果其中一台机器出现故障,调度任务失败,任务不会转移。
随机 当选择该策略时,会按照执行器注册地址随机分配任务,如果其中一台机器出现故障,调度任务失败,任务不会转移。
一致性HASH 当选择该策略时,每个任务按照Hash算法固定选择某一台机器。如果那台机器出现故障,调度任务失败,任务不会转移。
最不经常使用 当选择该策略时,会优先选择使用频率最低的那台机器,如果其中一台机器出现故障,调度任务失败,任务不会转移。
(实践表明效果和轮询策略一致)
最近最久未使用 当选择该策略时,会优先选择最久未使用的机器,如果其中一台机器出现故障,调度任务失败,任务不会转移。
(实践表明效果和轮询策略一致)
故障转移 当选择该策略时,按照顺序依次进行心跳检测,如果其中一台机器出现故障,则会转移到下一个执行器,
若心跳检测成功,会选定为目标执行器并发起调度。
忙碌转移 当选择该策略时,按照顺序依次进行空闲检测,如果其中一台机器出现故障,则会转移到下一个执行器,
若空闲检测成功,会选定为目标执行器并发起调度。
分片广播 当选择该策略时,广播触发对应集群中所有机器执行一次任务,同时系统自动传递分片参数;
可根据分片参数开发分片任务。如果其中一台机器出现故障,则该执行器执行失败,不会影响其他执行器。
阻塞策略 单机串行 调度请求进入单机执行器后,调度请求进入FIFO队列并以串行方式运行
丢弃后续调度 调度请求进入单机执行器后,发现执行器存在运行的调度任务,本次请求将会被丢弃并标记为失败
覆盖之前调度 调度请求进入单机执行器后,发现执行器存在运行的调度任务,将会终止运行中的调度任务并清空队列,然后运行本地调度任务

*参考自https://www.freesion.com/article/8626516462/

你可能感兴趣的:(任务调度,微服务,java,分布式,java,开发语言)