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


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

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

  • 相关阅读:
    RFID物流仓储管理系统解决方案
    鸿鹄工程项目管理系统 Spring Cloud+Spring Boot+Mybatis+Vue+ElementUI+前后端分离构建工程项目管理系统项目背景
    协程和Flow
    cjson报错
    【零基础学QT】第七章 网络通信,TCP、UDP通信实验
    Sui账户抽象消除用户使用障碍,让大规模用户使用区块链成为可能
    电子眼与无人机在城市安防中的协同应用研究
    搭建接口平台YApi详解(含搭建node环境)
    【MySQL数据库】- 多表查询
    使用Docker安装和部署RabbitMQ
  • 原文地址:https://blog.csdn.net/L__MY/article/details/133770979