在上一篇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新的东西继续更新。欢迎交流