elastic-job:参考elastic-console在自己代码中实现任务的失效、生效、终止操作

本文介绍了如何参考elastic-job-lite-console的源码,在自己的代码中实现elastic-job任务的失效、生效和终止操作。通过JobAPIService接口的getJobOperatorAPI()方法获取JobOperateAPI接口实现类,进而进行任务状态的动态管理。需要注意的是,shutdown后的任务状态为已下线,需重新添加任务才能进行disable和enable操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在上一篇https://blog.youkuaiyun.com/shn1994/article/details/93873479

中,可以进行任务的动态配置,这样我们就可以把任务的名称(jobName),cron,分片数,个性化参数通过接口进行添加任务,或者配置在数据库中进行相应的操作。能进行了任务的动态添加,那如何进行任务的失效、生效和终止呢,答案在elastic-job-lite-console,可以参考控制台的源码。

看任务的临时失效、生效、终止主要是JobAPIService接口中的getJobOperatorAPI()这个方法,得到JobOperateAPI接口实现类的对象,JobOperateAPI接口如下

public interface JobOperateAPI {
    void trigger(Optional<String> var1, Optional<String> var2);

    void disable(Optional<String> var1, Optional<String> var2);

    void enable(Optional<String> var1, Optional<String> var2);

    void shutdown(Optional<String> var1, Optional<String> var2);

    void remove(Optional<String> var1, Optional<String> var2);
}

项目结构

实现类是JobOperateAPIImpl,接口JobOperateAPI在elastic-job-lite-lifecycle中

现在参考elastic-job-lite-console源码进行相应的改造

一:接着上一篇的项目继续,新加入elastic-job-lite-lifecycle的jar包,注意需要去掉里面的

jetty-all-server,否则项目会有错
		<dependency>
			<groupId>com.dangdang</groupId>
			<artifactId>elastic-job-lite-lifecycle</artifactId>
			<exclusions>
				<exclusion>
					<groupId>org.eclipse.jetty.aggregate</groupId>
					<artifactId>jetty-all-server</artifactId>
				</exclusion>
			</exclusions>
			<version>${elastic-job.version}</version>
		</dependency>
二:接口JobAPIService(从源码中参考)
package com.threejie.demo.service;


import com.dangdang.ddframe.job.lite.lifecycle.api.*;

public interface JobAPIService {
    //配置相关的
    JobSettingsAPI getJobSettingsAPI();
    //操作相关的
    JobOperateAPI getJobOperatorAPI();
    

}

 

三:实现接口JobAPIService的类JobAPIServiceImpl

package com.threejie.demo.service.impl;


import com.dangdang.ddframe.job.lite.lifecycle.api.*;
import com.google.common.base.Optional;
import com.threejie.demo.service.JobAPIService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

/**
 * 作业API服务实现类.
 * 
 * @author zhangliang 
 */
@Service
public/* final*/ class JobAPIServiceImpl implements JobAPIService {

    @Value("${regCenter.serverList}")
    private String connectString;

    @Value("${regCenter.namespace}")
    private String namespace;

    @Override
    public JobSettingsAPI getJobSettingsAPI() {
        return JobAPIFactory.createJobSettingsAPI(connectString,namespace, Optional.fromNullable(null));
    }
    
    @Override
    public JobOperateAPI getJobOperatorAPI() {
        return JobAPIFactory.createJobOperateAPI(connectString,namespace, Optional.fromNullable(null));
    }

}

四:现在相应的接口进行相应的操作

package com.threejie.demo.controller;

import com.dangdang.ddframe.job.lite.lifecycle.api.JobOperateAPI;
import com.google.common.base.Optional;
import com.threejie.demo.dynamic.AddJob;
import com.threejie.demo.jobs.DynamicJob;
import com.threejie.demo.service.JobAPIService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class JobController {
    @Autowired
    private AddJob addJob;
    @Autowired
    private JobAPIService JobAPIServiceImpl;

    /**
     * 添加任务
     * @param cron
     * @param jobName
     * @param shardingTotalCount
     * @param shardingItemParameters
     * @return
     */
    @RequestMapping("/addJob")
    public String addJob(@RequestParam String cron,
                         @RequestParam String jobName,
                         @RequestParam Integer shardingTotalCount,
                         @RequestParam String shardingItemParameters) {

        addJob.addjobs(jobName, new DynamicJob(), cron, shardingTotalCount, shardingItemParameters);
        return "0000";
    }

    /**
     * 失效
     * @param jobName
     * @return
     */
    @RequestMapping("/disable")
    public String disable(@RequestParam String jobName){
         JobOperateAPI jobOperatorAPI = JobAPIServiceImpl.getJobOperatorAPI();
        jobOperatorAPI.disable(Optional.of(jobName), Optional.<String>absent());
        return "0000";
    }

    /**
     * 生效
     * @param jobName
     * @return
     */
    @RequestMapping("/enable")
    public String enable(@RequestParam String jobName){
        JobOperateAPI jobOperatorAPI = JobAPIServiceImpl.getJobOperatorAPI();
        jobOperatorAPI.enable(Optional.of(jobName), Optional.<String>absent());
        return "0000";
    }

    /**
     * 对应控制台的终止的按钮,也就是下线的效果
     * @param jobName
     * @return
     */
    @RequestMapping("/shutdown")
    public String shutdown(@RequestParam String jobName){
        JobOperateAPI jobOperatorAPI = JobAPIServiceImpl.getJobOperatorAPI();
        jobOperatorAPI.shutdown(Optional.of(jobName), Optional.<String>absent());
        return "0000";
    }

    /**
     * 进去看代码,这个会调用shutdown(jobName, serverIp)
     * @param jobName
     * @return
     */
    @RequestMapping("/remove")
    public String remove(@RequestParam String jobName){
        JobOperateAPI jobOperatorAPI = JobAPIServiceImpl.getJobOperatorAPI();
        jobOperatorAPI.remove(Optional.of(jobName), Optional.<String>absent());
        return "0000";
    }

    /**
     * 触发
     * @param jobName
     * @return
     */
    @RequestMapping("/trigger")
    public String trigger(@RequestParam String jobName){
        JobOperateAPI jobOperatorAPI = JobAPIServiceImpl.getJobOperatorAPI();
        jobOperatorAPI.enable(Optional.of(jobName), Optional.<String>absent());
        return "0000";
    }



}

注意:enable 和disable之间可以相互转换,也就是控制台中的生效和失效。但是如果shutdown之后,状态就是已下线,只有重新调用添加任务的接口(注意调用哪台服务器上的哪台才会生效)才会可以进行disable和enable操作。shutdown就是下线任务。

可以通过elastic-job-lite-console源码自定义很多自己操作任务,比如

JobSettingsAPI进行相关配置的修改等等。这个和
JobOperateAPI修改类似,也有统计之类的,就不在赘述了。上面也是需求推动去寻求的解决方案。后面在发现elastic-job新的东西继续更新。欢迎交流
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值