XXL-JOB学习笔记-基于注解实现自动注册新建任务

news/2024/5/18 23:03:02 标签: java, spring boot, xxl-job
项目每次注册新建任务都需要手动操作配置xxl-job,不同的环境都需要手动操作配置一次,比较麻烦,为此想要简化相关的手动操作工作,基于注解的形式实现自动注册新建任务。
本篇是在之前一篇基于代码实现新建任务的基础上进一步实现。主要思路就是在原有的@XxlJob注解上新增一个自定义注解@XxlJobRegister,暂时是在事件监听机制中扫描目标方法,然后根据自定义注解实现自动注册新建任务的功能。
  • 自定义注册新建任务的注解
java">@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface XxlJobRegister {

    String jobDesc() default "default jobDesc";

    String author() default "default Author";

    String alarmEmail () default "";

    /** NONE CRON FIX_RATE */
    String scheduleType() default "CRON";

    String cronExpression();

    /**  默认为 ROUND 轮询方式 可选: FIRST LAST ROUND RANDOM CONSISTENT_HASH
     * LEAST_FREQUENTLY_USED LEAST_RECENTLY_USED FAILOVER BUSYOVER SHARDING_BROADCAST */
    String executorRouteStrategy() default "ROUND";

    /** DO_NOTHING FIRE_ONCE_NOW */
    String misfireStrategy() default "DO_NOTHING";

    String executorBlockStrategy() default "SERIAL_EXECUTION";

    int executorTimeout() default 0;

    int executorFailRetryCount() default 0;

    String glueType() default "BEAN";

    String glueRemark() default "GLUE代码初始化";

    int triggerStatus() default 0;

    boolean isStart() default false;

}
  • 基于事件监听机制,监听ApplicationReadyEvent事件,扫描带有@XxlJob注解的目标方法,然后在根据@XxlJobRegister注解实现自动注册新建任务
java">@Slf4j
@Component
public class JobInfoRegisterListener implements ApplicationContextAware, ApplicationListener<ApplicationReadyEvent> {

    @Value("${xxl.job.executor.app-name:}")
    private String appName;

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

    /** 执行器地址类型:0=自动注册、1=手动录入 */
    @Value("${xxl.job.executor.address-type:0}")
    private Integer addressType;

    /** 执行器地址列表,多地址逗号分隔(手动录入) */
    @Value("${xxl.job.executor.address-list:}")
    private String addressList;

    private ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) {
        this.applicationContext = applicationContext;
    }

    @Override
    public void onApplicationEvent(ApplicationReadyEvent event) {
        JobGroupService jobGroupService = applicationContext.getBean(JobGroupService.class);
        JobGroup jobGroup = jobGroupService.readByAppName(appName);
        if (ObjectUtil.isNull(jobGroup)) {
            Boolean result = jobGroupService.save(appName, name, addressType, addressList);
            if (result) {
                jobGroup = jobGroupService.readByAppName(appName);
            }
        }
        if (ObjectUtil.isNull(jobGroup)) {
            return;
        }
        int jobGroupId = jobGroup.getId();
        JobInfoService jobInfoService = applicationContext.getBean(JobInfoService.class);
        Map<String, Object> beanMap =
            applicationContext.getBeansOfType(Object.class, false, true);
        for (Map.Entry<String, Object> beanEntry : beanMap.entrySet()) {
            Map<Method, XxlJob> methodXxlJobMap = MethodIntrospector.selectMethods(beanEntry.getValue().getClass(),
                new MethodIntrospector.MetadataLookup<XxlJob>() {
                    @Override
                    public XxlJob inspect(Method method) {
                        return AnnotatedElementUtils.findMergedAnnotation(method, XxlJob.class);
                    }
                });
            for (Map.Entry<Method, XxlJob> methodXxlJobEntry : methodXxlJobMap.entrySet()) {
                Method method = methodXxlJobEntry.getKey();
                if (!method.isAnnotationPresent(XxlJobRegister.class)) {
                    continue;
                }
                XxlJobRegister xxlJobRegister = method.getAnnotation(XxlJobRegister.class);
                if (ObjectUtil.isNull(xxlJobRegister)) {
                    continue;
                }
                String executorHandler = methodXxlJobEntry.getValue().value();
                JobInfo jobInfo = jobInfoService.readByJobGroupIdAndHandler(jobGroupId, executorHandler);
                if (ObjectUtil.isNotNull(jobInfo)) {
                    log.info("Job info already exists {} {}", jobGroupId, executorHandler);
                    continue;
                }
                try {
                    jobInfoService.save(jobGroupId, executorHandler, xxlJobRegister);
                } catch (Exception e) {
                    log.error(e.getMessage(), e);
                }
            }
        }
    }

}

自此,可以根据项目的需求,自主配置是否在项目启动的时候自动注册新建任务至xxl-job


http://www.niftyadmin.cn/n/5295666.html

相关文章

【计算机毕业设计】python+django数码电子论坛系统设计与实现

本系统主要包括管理员和用户两个角色组成&#xff1b;主要包括&#xff1a;首页、个人中心、用户管理、分类管理、数码板块管理、数码评价管理、数码论坛管理、畅聊板块管理、系统管理等功能的管理系统。 后端&#xff1a;pythondjango 前端&#xff1a;vue.jselementui 框架&a…

Hive集群出现报错信息解决办法

一、报错信息&#xff1a;hive> show databases;FAILED: HiveException java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient 解决办法&#xff1a;1.删除mysql中的元数据库&#xff08;metastore&#xff0…

Python基础语法笔记 tkinter的简单使用

语法 物质 动态类型语言,不需要声明类型 数字 类型int float bool 操作 //整除 **幂 字符串 str1 "Hello python" str2 "world" print(str1 * 3) # 重复输出 print(str1[1]) # 索引访问 print(str1 " " str2) # 拼接 print(str1[2…

第一讲:BeanFactory和ApplicationContext

BeanFactory和ApplicationContext 什么是BeanFactory 它是ApplicationContext的父接口它才是Spring的核心容器&#xff0c;主要的ApplicationContext实现都组合了它的功能 BeanFactory能做什么? 表面上看BeanFactory的主要方法只有getBean()&#xff0c;实际上控制反转、基…

微服务系列之分布式事务理论

概述 事务是由一组操作构成的可靠的独立的工作单元&#xff0c;事务具备ACID的特性&#xff0c;即原子性、一致性、隔离性和持久性。 分类 大多数情况下&#xff0c;分类是没有意义的一件事。但是分类可以一定程度上&#xff0c;加深理解。 实现 从实现角度来看&#xff0…

【Kubernetes】控制器Daemonset

Daemonset控制器 一、简介1.1、概念1.2、原理1.3、应用场景1.4、DaemonSet 与 Deployment 的区别 二、DaemonSet资源清单文件编写技巧2.1、查看定义Daemonset资源需要的字段有哪些2.2、查看DaemonSet的spec字段如何定义2.3、查看DaemonSet的spec.template字段如何定义 三、Daem…

Activemq存储KahaDb详解

引言 ActiveMQ在不提供持久化的情况下&#xff0c;数据保存在内存中&#xff0c;一旦应用崩溃或者重启之后&#xff0c;数据都将会丢失&#xff0c;这显然在大部分情况下是我们所不希望的。对此ActiveMQ提供了两种持久化方式以供选择。 kahaDB kahaDB是一个基于文件&#xf…

Springer build pdf乱码

在textstudio中编辑时没有错误&#xff0c;在editor manager生成pdf时报错。 首先不要改源文件&#xff0c;着重看你的上传顺序&#xff1a; 将.tex文件&#xff0c;.bst文件&#xff0c;.cls文件&#xff0c;.bib文件, .bbl文件的类型&#xff0c;在editor manager中是Item。…