如果想让定时任务分到同一个包里,根据执行参数来控制是否执行,可以自定义个@Scheduled.
使用方式与@Scheduled一样.写在run()方法上
比如:
@MyScheduled(fixedDelay = 5000)
1.写个接口命名为MyScheduled,内容参照@Scheduled接口
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Scheduled
@Repeatable(MySchedules.class)
public @interface MyScheduled {
//此处copy @Scheduled接口内容
}
2.写个接口MySchedules参照@Schedules接口
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MySchedules {
MyScheduled[] value();
}
3.重写解析方式:继承ScheduledAnnotationBeanPostProcessor
@Override
public Object postProcessAfterInitialization(final Object bean, String beanName) {
//1.如果符合要求,启动
if(SystemEnviroment.taskEnable) {
super.postProcessAfterInitialization(bean, beanName);
return bean;
}
//2.如果不符合要求,取消
Class<?> targetClass = AopUtils.getTargetClass(bean);
Map<Method, Set<MyScheduled>> annotatedMethods = MethodIntrospector.selectMethods(targetClass,new MethodIntrospector.MetadataLookup<Set<MyScheduled>>() {
@Override
public Set<MyScheduled> inspect(Method method) {
Set<MyScheduled> scheduledMethods = AnnotatedElementUtils.getMergedRepeatableAnnotations(
method, MyScheduled.class, MySchedules.class);
return (!scheduledMethods.isEmpty() ? scheduledMethods : null);
}
});
if(annotatedMethods.isEmpty()) {//如果为空,放过
super.postProcessAfterInitialization(bean, beanName);
}else {//如果不为空,说明不是需要启动的,应该销毁任务
super.postProcessBeforeDestruction(bean, beanName);
}
return bean;
}