springboot uses xxl-job (registered executor)

XXL open source community

Introduce dependencies

        <dependency>
            <groupId>com.xuxueli</groupId>
            <artifactId>xxl-job-core</artifactId>
            <version>2.4.0</version>
        </dependency>

add configuration


# log config
logging.config=classpath:logback.xml

### xxl-job admin address list, such as "http://address" or "http://address01,http://address02"
xxl.job.admin.addresses=http://127.0.0.1:8282/xxl-job-admin

### xxl-job, access token
xxl.job.accessToken=default_token

### xxl-job executor appname 执行器名称
xxl.job.executor.appname=xxl-job-sensor
### xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is null
xxl.job.executor.address=
### xxl-job executor server-info
xxl.job.executor.ip=
xxl.job.executor.port=9988
### xxl-job executor log-path
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
### xxl-job executor log-retention-days
xxl.job.executor.logretentiondays=20

Initial configuration

package com.sensor.wksensorapp.config;

import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.SneakyThrows;
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.Configuration;

import java.util.Date;

/**
 * @Author: chenl
 * @Date: 2023/7/28
 */
@Configuration
public class XxlJobConfig {
    
    

    private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);

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

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

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

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

    @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() {
    
    
        logger.info(">>>>>>>>>>> xxl-job config init.");
        XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
        xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
        xxlJobSpringExecutor.setAppname(appname);
        xxlJobSpringExecutor.setAddress(address);
        xxlJobSpringExecutor.setIp(ip);
        xxlJobSpringExecutor.setPort(port);
        xxlJobSpringExecutor.setAccessToken(accessToken);
        xxlJobSpringExecutor.setLogPath(logPath);
        xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);

        return xxlJobSpringExecutor;
    }

    /**
     * 针对多网卡、容器内部署等情况,可借助 "spring-cloud-commons" 提供的 "InetUtils" 组件灵活定制注册IP;
     *
     *      1、引入依赖:
     *          <dependency>
     *             <groupId>org.springframework.cloud</groupId>
     *             <artifactId>spring-cloud-commons</artifactId>
     *             <version>${version}</version>
     *         </dependency>
     *
     *      2、配置文件,或者容器启动变量
     *          spring.cloud.inetutils.preferred-networks: 'xxx.xxx.xxx.'
     *
     *      3、获取IP
     *          String ip_ = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();
     */


    @SneakyThrows
    @XxlJob("testHanld")
    public void ttHanld(){
    
    
        String param = XxlJobHelper.getJobParam();
        System.out.println(param);
        System.out.println("执行操作");
    }
}

admin configuration

insert image description here

Dynamically add tasks

Get the group id of the executor

@Component
public class XxlJobUtil {
    
    
    private static Logger logger = LoggerFactory.getLogger(XxlJobUtil.class);

    // 执行器名称
    public static String appName;
    // 执行器分组id
    public static Integer groupId;
    // 连接xxl-job-admin 的认证token
    public static String accessToken;


    @Resource
    public XxlJobService xxlJobService;


    @Value("${xxl.job.accessToken}")
    public void setAccessToken(String accessToken) {
    
    
        XxlJobUtil.accessToken = accessToken;
    }

    @Value("${xxl.job.executor.appname}")
    public void setAppName(String appName) {
    
    
        XxlJobUtil.appName = appName;
    }


    @EventListener
    public void init(ApplicationReadyEvent event) {
    
    
        Map<String, Object> stringObjectMap = xxlJobService.groupPageList(0, 3, appName, "");

        if(ObjectUtil.isNull(stringObjectMap) && Integer.valueOf(stringObjectMap.get("recordsTotal").toString())<=0){
    
    
            // 如果说想动态注册执行器,可以在这里调用进行新增
           throw new RuntimeException("-------没有从xxl-job获取到"+appName+"的执行器---------");
        }
        List<XxlJobGroup> list = (List<XxlJobGroup>) stringObjectMap.get("data");
        groupId = list.get(0).getId();
        logger.info("-------------获取到xxl-job的执行分组id:"+groupId+"--------------");
    }


}


Entity class

@Data
public class XxlJobInfo {
    
    

    private int id;				// 主键ID

    private int jobGroup;		// 执行器主键ID
    private String jobDesc;

    private Date addTime;
    private Date updateTime;

    private String author;		// 负责人
    private String alarmEmail;	// 报警邮件

    private String scheduleType;			// 调度类型
    private String scheduleConf;			// 调度配置,值含义取决于调度类型
    private String misfireStrategy;			// 调度过期策略

    private String executorRouteStrategy;	// 执行器路由策略
    private String executorHandler;		    // 执行器,任务Handler名称
    private String executorParam;		    // 执行器,任务参数
    private String executorBlockStrategy;	// 阻塞处理策略
    private int executorTimeout;     		// 任务执行超时时间,单位秒
    private int executorFailRetryCount;		// 失败重试次数

    private String glueType;		// GLUE类型	#com.xxl.job.core.glue.GlueTypeEnum
    private String glueSource;		// GLUE源代码
    private String glueRemark;		// GLUE备注
    private Date glueUpdatetime;	// GLUE更新时间

    private String childJobId;		// 子任务ID,多个逗号分隔

    private int triggerStatus;		// 调度状态:0-停止,1-运行
    private long triggerLastTime;	// 上次调度时间
    private long triggerNextTime;	// 下次调度时间


    public XxlJobInfo() {
    
    
        // cron
        // scheduleType: CRON
        // scheduleConf: 0/23 * * * * ?
        // cronGen_display: 0/23 * * * * ?
        // schedule_conf_CRON: 0/23 * * * * ?
        //  固定时间,时间单位是秒
        // scheduleType: FIX_RATE
        // scheduleConf: 1
        // schedule_conf_FIX_RATE: 1

		// 固定字段,上面是二选一
        this.executorRouteStrategy = "FIRST";
        this.misfireStrategy = "DO_NOTHING";
        this.executorBlockStrategy = "SERIAL_EXECUTION";
        this.executorTimeout = 0;
        this.executorFailRetryCount = 0;
        this.glueRemark = "手动添加";
        this.glueType = "BEAN";
    }
}

openfeign call

@FeignClient(name = "xxl-job")
public interface XxlJobService {
    
    
    @PostMapping(value = "/xxl-job-admin/feign/add")
    public ReturnT<String> add(@RequestBody XxlJobInfo jobInfo);

    @PostMapping("/xxl-job-admin/feign/update")
    public ReturnT<String> update(@RequestBody XxlJobInfo jobInfo);

    @PostMapping("/xxl-job-admin/feign/remove")
    public ReturnT<String> remove(@RequestParam("id") int id);

    @PostMapping("/xxl-job-admin/feign/stop")
    public ReturnT<String> pause(@RequestParam("id") int id);

    @PostMapping("/xxl-job-admin/feign/start")
    public ReturnT<String> start(@RequestParam("id") int id);


    @PostMapping("/xxl-job-admin/feign/pageList")
    public Map<String, Object> pageList(@RequestParam(required = false, defaultValue = "0") int start,
                                        @RequestParam(required = false, defaultValue = "10") int length,
                                        @RequestParam int jobGroup,@RequestParam int triggerStatus,
                                        @RequestParam String jobDesc,@RequestParam String executorHandler,
                                        @RequestParam String author);

    @PostMapping("/xxl-job-admin/feign/groupPageList")
    public Map<String, Object> groupPageList(@RequestParam(required = false, defaultValue = "0") int start,
                                        @RequestParam(required = false, defaultValue = "10") int length,
                                        @RequestParam String appname,@RequestParam String title);

}

controller

    @GetMapping("/addTask")
    public void addTask(){
    
    
        XxlJobInfo xxlJobInfo = new XxlJobInfo();
        xxlJobInfo.setScheduleType("FIX_RATE");
        xxlJobInfo.setScheduleConf("1");
        xxlJobInfo.setExecutorHandler("testHanld");
        xxlJobInfo.setJobGroup(XxlJobUtil.groupId);
        xxlJobInfo.setJobDesc("自动添加");
        xxlJobInfo.setAuthor("test");
        xxlJobInfo.setExecutorParam("{name:1}");
        xxlJobInfo.setId(0);

        ReturnT<String> result = xxlJobService.add(xxlJobInfo);
        if(result.getCode()==200){
    
    
            System.out.println(result.getContent()); // 返回任务id
            xxlJobService.start(Integer.valueOf(result.getContent())); // 启动任务
        }
    }

Resource view xxl-job-admin

Guess you like

Origin blog.csdn.net/weixin_43051544/article/details/132149322