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

项目每次注册新建任务都需要手动操作配置xxl-job,不同的环境都需要手动操作配置一次,比较麻烦,为此想要简化相关的手动操作工作,基于注解的形式实现自动注册新建任务。
本篇是在之前一篇基于代码实现新建任务的基础上进一步实现。主要思路就是在原有的@XxlJob注解上新增一个自定义注解@XxlJobRegister,暂时是在事件监听机制中扫描目标方法,然后根据自定义注解实现自动注册新建任务的功能。
  • 自定义注册新建任务的注解
@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注解实现自动注册新建任务
@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。

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
xxl-job中,动态添加任务可以使用注解实现。首先,你需要在任务类上添加`@XxlJob`注解,该注解包含了任务的基本信息配置。例如: ```java @XxlJob("myJobHandler") public class MyJobHandler { @XxlJob(value = "myJobHandler", init = "init", destroy = "destroy") public void execute() { // 任务逻辑代码 } public void init() { // 初始化方法,可选 } public void destroy() { // 销毁方法,可选 } } ``` 在上面的代码中,`@XxlJob`注解的value属性指定了任务的名称,init属性指定了初始化方法,destroy属性指定了销毁方法。`execute`方法是任务的执行方法,你可以在其中编写具体的任务逻辑。 然后,你需要在Spring配置文件中添加相关的配置,以使得xxl-job能够扫描到任务类。例如: ```xml <bean id="myJobHandler" class="com.example.MyJobHandler"/> <bean id="xxlJobSpringExecutor" class="com.xxl.job.core.executor.impl.XxlJobSpringExecutor"> <property name="jobHandlers"> <map> <entry key="myJobHandler" value-ref="myJobHandler"/> </map> </property> </bean> ``` 在上面的配置中,`myJobHandler`是任务类的实例,`xxlJobSpringExecutor`是xxl-job的执行器,通过配置`jobHandlers`属性将任务注册到执行器中。 最后,你可以在xxl-job的管理后台动态添加任务,指定任务的名称为`myJobHandler`,即与注解中的value属性对应。 这样,当xxl-job启动时,它会自动扫描任务类并注册到执行器中,然后你就可以在管理后台动态添加该任务并进行调度了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值