spring 自定义注解+AOP切面,控制任务是否执行

  1. 自定义注解, 设置控制参数
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TaskSwitch {
    /** 任务名称 */
    String taskName();
    /** 任务开关 */
    String switchKey();
    /** 只在工作日执行,其他控制逻辑 */
    boolean onlyWorkDayExecute() default false;
}
  1. 设置切面, 控制执行逻辑
@Aspect
@Component
public class TaskControlAop {
    private final Logger logger = LoggerFactory.getLogger(getClass());

    /**
     * -@Around --环绕通知
     * -@annotation --基于方法注解的切面
     * @param proceedingJoinPoint 继承自JointPoint, 可获取切入点的对象,方法,属性等, proceed()方法可触发切入代码执行
     * @param taskSwitch 可获取注解内容
     */
    @Around("@annotation(taskSwitch)")
    public Object taskControl(ProceedingJoinPoint proceedingJoinPoint, TaskSwitch taskSwitch){
        if (StringUtils.equalsAnyIgnoreCase(taskSwitch.switchKey(), "开", "开启", "1", "ON", "True", "T")) {
            Object proceed = null;
            try {
                if (taskSwitch.onlyWorkDayExecute()) {
                    logger.info("任务--{},非工作日不执行", taskSwitch.taskName());
                } else {
                    logger.info("任务--{},开始...", taskSwitch.taskName());
                    proceed = proceedingJoinPoint.proceed();
                    logger.info("任务--{},结束.", taskSwitch.taskName());
                }
                // 返回执行结果
                return proceed;
            } catch (Throwable throwable) {
                logger.error("任务--{}失败!", taskSwitch.taskName(), throwable);
                // 如不抛出错误,事务不会生效
                throw new RuntimeException(throwable);
            }
        } else {
            logger.info("任务--{},不执行,任务开关{}未开启", taskSwitch.taskName(), taskSwitch.switchKey());
        }
        return null;
}
  1. 在业务方法上添加注解
    @TaskSwitch(taskName = "前进的方向", switchKey = "1")
    public void run() {
        System.out.println("早起5公里");
    }
  1. 最后, 别忘了激活切面
@EnableAspectJAutoProxy
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容