- 自定义注解, 设置控制参数
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TaskSwitch {
/** 任务名称 */
String taskName();
/** 任务开关 */
String switchKey();
/** 只在工作日执行,其他控制逻辑 */
boolean onlyWorkDayExecute() default false;
}
- 设置切面, 控制执行逻辑
@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;
}
- 在业务方法上添加注解
@TaskSwitch(taskName = "前进的方向", switchKey = "1")
public void run() {
System.out.println("早起5公里");
}
- 最后, 别忘了激活切面
@EnableAspectJAutoProxy