注册新executor
到调度中心:
public boolean autoRegisterGroup() {String url=adminAddresses+"/jobgroup/save";HttpResponse response = HttpRequest.post(url).form("appname", appName).form("title", title).cookie(jobLoginService.getCookie()).execute();Object code = JSONUtil.parse(response.body()).getByPath("code");return code.equals(200);}
任务接口创建一个JobInfoService
,根据执行器id
,jobHandler
名称查询任务列表,和上面一样,也是模糊查询:
public List<XxlJobInfo> getJobInfo(Integer jobGroupId,String executorHandler) {String url=adminAddresses+"/jobinfo/pageList";HttpResponse response = HttpRequest.post(url).form("jobGroup", jobGroupId).form("executorHandler", executorHandler).form("triggerStatus", -1).cookie(jobLoginService.getCookie()).execute();String body = response.body();JSONArray array = JSONUtil.parse(body).getByPath("data", JSONArray.class);List<XxlJobInfo> list = array.stream().map(o -> JSONUtil.toBean((JSONObject) o, XxlJobInfo.class)).collect(Collectors.toList());return list;}
注册一个新任务,最终返回创建的新任务的id
:
public Integer addJobInfo(XxlJobInfo xxlJobInfo) {String url=adminAddresses+"/jobinfo/add";Map<String, Object> paramMap = BeanUtil.beanToMap(xxlJobInfo);HttpResponse response = HttpRequest.post(url).form(paramMap).cookie(jobLoginService.getCookie()).execute();JSON json = JSONUtil.parse(response.body());Object code = json.getByPath("code");if (code.equals(200)){return Convert.toInt(json.getByPath("content"));}throw new RuntimeException("add jobInfo error!");}
2、创建新注解在创建任务时,必填字段除了执行器和jobHandler
之外,还有任务描述、负责人、Cron表达式、调度类型、运行模式 。在这里,我们默认调度类型为CRON
、运行模式为BEAN
,另外的3个字段的信息需要用户指定 。
因此我们需要创建一个新注解@XxlRegister
,来配合原生的@XxlJob
注解进行使用,填写这几个字段的信息:
@Target({ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)public @interface XxlRegister {String cron();String jobDesc() default "default jobDesc";String author() default "default Author";int triggerStatus() default 0;}
最后,额外添加了一个triggerStatus
属性,表示任务的默认调度状态,0为停止状态,1为运行状态 。
3、自动注册核心基本准备工作做完后,下面实现自动注册执行器和jobHandler
的核心代码 。核心类实现ApplicationListener
接口,在接收到ApplicationReadyEvent
事件后开始执行自动注册逻辑 。
@Componentpublic class XxlJobAutoRegister implements ApplicationListener<ApplicationReadyEvent>,ApplicationContextAware {private static final Log log =LogFactory.get();private ApplicationContext applicationContext;@Autowiredprivate JobGroupService jobGroupService;@Autowiredprivate JobInfoService jobInfoService;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext=applicationContext;}@Overridepublic void onApplicationEvent(ApplicationReadyEvent event) {addJobGroup();//注册执行器addJobInfo();//注册任务}}
自动注册执行器的代码非常简单,根据配置文件中的appName
和title
精确匹配查看调度中心是否已有执行器被注册过了,如果存在则跳过,不存在则新注册一个:
private void addJobGroup() {if (jobGroupService.preciselyCheck())return;if(jobGroupService.autoRegisterGroup())log.info("auto register xxl-job group success!");}
自动注册任务的逻辑则相对复杂一些,需要完成:
- 通过
applicationContext
拿到spring容器中的所有bean,再拿到这些bean中所有添加了经验总结扩展阅读
- 牙龈炎怎么办
- 在爱情中容易彻底沦陷的星座
- 新版微信怎么彻底删除微信好友方法(微信如何迁移微信好友)
- 如何彻底的忘记前男友
- 车上有跳蚤怎么彻底消灭
- 电脑弹窗广告怎么彻底关闭
- 金喜善 金喜善怎么变成这样!最新亮相换新发型扮嫩,五官大变彻底认不出!
- 磁石面膜怎么清洗?
- 如何彻底清理微信缓存图片视频垃圾?
- 发型 中美这场较量,美国彻底完败!当着世界的面,崔天凯对美发出强音