注解实现xxl-job入参解析

该文章介绍了一种通过注解和AOP技术来实现对xxl-job任务入参的解析方法。定义了一个Job注解用于标记含有特定参数的方法,AOP切面处理这些标记的方法,进行日志记录和参数封装。此外,还提供了一个参数解析工具类,根据参数类型(如XML或JSON)进行不同方式的转换。示例中展示了注解的使用和一个XML参数类的实现。
摘要由CSDN通过智能技术生成

        通过注解及AOP实现xxl-job入参解析

一 注解类

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface Job {
    /**
     * @return job枚举
     */
    JobEnum jobEnum();

    /**
     * @return 是否存在job参数
     */
    boolean isJobParam() default true;

    /**
     * @return job参数在方法参数中的序号,默认为第一个参数(isJobParam == true时生效)
     */
    int jobParamIndex() default 0;
}

二 AOP实现参数解析


/**
 * Job 注解切面实现
 * 添加job日志,以及封装xxljob参数
 */
@Aspect
@Component
public class JobAspect {
    private static final Logger LOGGER = LoggerFactory.getLogger(JobAspect.class);
    private static final String JOB_LOGGER_ANNOTATION = "com.test.support.job.Job";
    private static final String XXL_JOB_PACKAGE = "com.test.job";

    /**
     * 定义JobLogger切面
     */
    @Pointcut("@annotation(" + JOB_LOGGER_ANNOTATION + ")")
    public void taskAspect() {
        // do nothing
    }

    /**
     * JobLogger切面具体逻辑
     * 1.打印日志
     * 2.获取入参
     * @param joinPoint 切点
     * @param job JobLogger注解
     * @throws Throwable 异常
     */
    @Around("taskAspect() && @annotation(job)")
    public void around(ProceedingJoinPoint joinPoint, Job job) throws Throwable {
        XxlJobHelper.log("[{}]任务开始", job.jobEnum().getJobName());
        LOGGER.info("[{}]任务开始", job.jobEnum().getJobName());
        try {
            Object[] args = joinPoint.getArgs();

            if (ObjectUtils.isNotEmpty(args) && job.isJobParam() && this.isXxlJobInvoke()) {
                String jobParam = XxlJobHelper.getJobParam();
                LOGGER.info("[{}]任务入参[{}]", job.jobEnum().getJobName(), jobParam);
                args[job.jobParamIndex()] = JobUtil.buildJobParam(job.jobEnum(), jobParam);
            }
            joinPoint.proceed(args);

            XxlJobHelper.log("[{}]任务结束", job.jobEnum().getJobName());
            LOGGER.info("[{}]任务结束", job.jobEnum().getJobName());
        } catch (Exception e) {
            XxlJobHelper.log("[{}]任务异常", job.jobEnum().getJobName());
            LOGGER.error("[{}]任务异常", job.jobEnum().getJobName(), e);
            throw e;
        }
    }

    /**
     * 判断是否xxljob调用
     * @return true:xxljob调用
     */
    private boolean isXxlJobInvoke() {
        StackTraceElement[] stackTrace = new RuntimeException().getStackTrace();
        for (StackTraceElement stackTraceElement : stackTrace) {
            if (stackTraceElement.getClassName().contains(XXL_JOB_PACKAGE)) {
                return true;
            }
        }
        return false;
    }
}

三 参数解析工具类

public class JobUtil {
    private JobUtil() {}

    public static IJobParam buildJobParam(JobEnum jobEnum, String jobParam) throws DocumentException,
            NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        if (StringUtils.isBlank(jobParam)) {
            return null;
        }
        if (JobParamTypeEnum.XML.equals(jobEnum.getParamTypeEnum())) {
            Document document = DocumentHelper.parseText(jobParam);
            if (document == null) {
                return null;
            }
            return jobEnum.getParamClass().getConstructor(Document.class).newInstance(document);
        } else if (JobParamTypeEnum.JSON.equals(jobEnum.getParamTypeEnum())) {
            return JSONObject.parseObject(jobParam, jobEnum.getParamClass());
        }
        return null;
    }
}

四 参数基类接口

public interface IJobParam extends Serializable {
}

五 xml参数类示例

@Getter
@Setter
public class TestParam implements IJobParam {
    private String a;
    
    public TestParam(Document document) {
        this.a = document.valueOf("/root/参数A");
    }
}

六 注解使用

    @XxlJob("test")
    @Job(jobEnum = JobEnum.TEST)
    public void test(TestParam param) throws Exception {
        testService.test(param);
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
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启动时,它会自动扫描任务类并注册到执行器中,然后你就可以在管理后台动态添加该任务并进行调度了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值