代码示例如下
import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.reflect.FieldUtils;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor;
import org.springframework.scheduling.config.CronTask;
import org.springframework.scheduling.config.ScheduledTask;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.*;
@Slf4j
public class BatchScheduledAnnotationBeanPostProcessor
extends ScheduledAnnotationBeanPostProcessor {
private Map<Object, Set<ScheduledTask>> scheduledTasksMap;
public BatchScheduledAnnotationBeanPostProcessor() {
try {
Field field = FieldUtils.getField(ScheduledAnnotationBeanPostProcessor.class, "scheduledTasks", true);
scheduledTasksMap = (Map<Object, Set<ScheduledTask>>) FieldUtils.readField(field, this, true);
} catch (Exception e) {
log.error("scheduledTasksMap", e);
}
}
@Override
protected void processScheduled(Scheduled scheduled, Method method, Object bean) {
super.processScheduled(scheduled, method, bean);
}
/* 动态注册 是个 cron task*/
public void registerCronTask(String cron, Method method, Object bean) {
Map<String, Object> attributes = Maps.newHashMap();
attributes.put("cron", cron);
Scheduled scheduled = AnnotationUtils.synthesizeAnnotation(attributes, Scheduled.class, null);
processScheduled(scheduled, method, bean);
}
/* 取消注册 Cron Task*/
public void unregisterCronTask(Object bean, String cron) {
synchronized (scheduledTasksMap) {
Set<ScheduledTask> tasks = getScheduledTasks();
for (ScheduledTask task : tasks) {
if (task.getTask() instanceof CronTask
// cron表达式相同时,取消并从scheduledTasks中的实例
&& ((CronTask) task.getTask()).getExpression().equals(cron)) {
task.cancel();
scheduledTasksMap.getOrDefault(bean, Collections.emptySet()).remove(task);
}
}
}
}
}