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


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

    一、自定义注解================
    @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;
    }
    }

  • 相关阅读:
    基于微信小程的流浪动物领养小程序设计与实现(源码+lw+部署文档+讲解等)
    【分享】许多 有意思的 颜文字表情包
    HyperGBM开源工程介绍
    (附源码)app学生社团管理系统 毕业设计 191850
    在Windows7在部署Hadoop+Hbase
    【单元测试与JUnit 4】传统main方法测试代码太麻烦?来试试JUnit4
    Docker部署
    智能工作流:Spring AI高效批量化提示访问方案
    【Linux】VSCode连接远程Linux服务器
    十大字体设计网站年终盘点:顶级设计师独家推荐
  • 原文地址:https://blog.csdn.net/L__MY/article/details/133770979