• 自定义注+切面控制方法执行步骤


    自定义注+切面控制方法执行步骤,执行过的方法不再执行

    一、自定义注解================
    @Target({ElementType.METHOD})
    @Documented
    @Retention(RetentionPolicy.RUNTIME)
    public @interface XXXTaskStep {
    String taskName();
    int taskStep();
    }

    二、方法执行步骤=================================
    @Transactional(rollbackFor = Exception.class)
    @XXXTaskStep (taskName = XXXConstants.Task.TASK_XXX, taskStep = 1)
    public void method1(SciRequestDTO request) {

    }
    
    @Transactional(rollbackFor = Exception.class)
    @XXXTaskStep (taskName = XXXConstants.Task.TASK_XXX, taskStep = 2)
    public void method2(SciRequestDTO request) {
    
    }
    
    @Transactional(rollbackFor = Exception.class)
    @XXXTaskStep (taskName = XXXConstants.Task.TASK_XXX, taskStep = 3)
    public void method3(SciRequestDTO request) {
       
    }
    
    @Transactional(rollbackFor = Exception.class)
    @XXXTaskStep (taskName = XXXConstants.Task.TASK_XXX, taskStep = 4)
    public void method4(SciRequestDTO request) {
      
    }
    
    @Transactional(rollbackFor = Exception.class)
    @XXXTaskStep (taskName = XXXConstants.Task.TASK_XXX, taskStep = 5)
         public void method5(SciRequestDTO request) {
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    三、切面逻辑===================================
    @Component
    @Aspect
    public class XXXTaskStepAspect {
    @Around(“@annotation(annotation.XXXTaskStep)”)
    public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
    Object result = null;
    MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
    //获取目标方法
    Method method = methodSignature.getMethod();
    //获取方法注解
    XXXTaskStep annotation = method.getAnnotation(PMPTaskStep.class);
    ScheduleTaskDO scheduleTaskDO = DomainFactory.create(ScheduleTaskDO.class)
    .setTaskName(annotation.taskName())
    .setTradingDay(PmpDateUtils.atStartOfDay(new Date()));
    // 按照创建时间获取最近的一条Task
    ScheduleTaskDO latestTaskDO = scheduleTaskDO.selectTask()
    .stream()
    .max(Comparator.comparing(ScheduleTaskDO::getCreateTime))
    .orElseThrow(IllegalArgumentException::new);
    //获取最新的指定的步骤
    int latestStep = latestTaskDO.getTaskStep();
    // 获取Task的状态,如果status = 0,则是刚执行
    int taskStatus = latestTaskDO.getTaskStatus();
    // 判断是否需要执行该方法,如果表记录中的步骤小于方法上注解的步骤或任务状态是0初始化,则继续执行
    if (0 == taskStatus || latestStep < annotation.taskStep()) {
    try {
    result = joinPoint.proceed();
    scheduleTaskDO.setTaskStep(annotation.taskStep())
    .setTaskStatus(StatusEnum.COMPLETE.getVal())
    .updateTask();
    } catch (Throwable throwable) {
    scheduleTaskDO.setTaskStatus(StatusEnum.FAILED.getVal())
    .setPmpTaskId(latestTaskDO.getPmpTaskId())
    .setErrorMessage(throwable.toString())
    .updateTask();
    }
    } else {
    }
    return result;
    }
    }

  • 相关阅读:
    redis分布式锁使用方式
    看动画,学Java基础教程13:变量
    二 centos 7.9 磁盘挂载
    实战——Linux调优命令1
    Python爬虫(二十)_动态爬取影评信息
    Wampserver使用问题记录
    极智AI | 有趣的羊驼系列大模型
    【M365运维】很抱歉、无法打开“https://..../.xlsx”
    Redis 集群配置
    Shell编程之免交互
  • 原文地址:https://blog.csdn.net/L__MY/article/details/133770979