aha*_*ani 5 spring schedule scheduled-tasks spring-boot
这是我的代码:
 @Scheduled(cron = "30 3 * * * *")
    public void myCron() {
        //we don't care what we do here
    }
我想知道是否可以在我的@Scheduled自动添加跟踪 ID(或其他信息)。
每次@Scheduled触发时 id 都会不同。
我想这样做是为了避免重复代码,例如:
@Scheduled(cron = "10 3 * * * *")
public void myCron() {
    MDC.put("myId", UUID.randomUUID().toString());
    //we don't care what we do here
}
@Scheduled(cron = "30 3 * * * *")
public void mySecondCron() {
    MDC.put("myId", UUID.randomUUID().toString());
    //we don't care what we do here
}
我厌倦了实现SchedulingConfigurer但是SchedulingConfigurer#configureTasks太晚了,因为任务(可运行)已经创建了
谢谢
您可以尝试实现自定义TaskScheduler并在SchedulingConfigurer.configureTasks. ConcurrentTaskScheduler可以视为一个例子。不幸的是,这个类不是为继承而精心设计的,否则decorateTask方法将受到保护。因此,您需要覆盖所有方法以使用您的逻辑添加一个额外的 Runnable 装饰器。像这样的东西:
@Configuration
@EnableScheduling
public class ScheduledConfig implements SchedulingConfigurer {
    public static class MyTaskScheduler extends ConcurrentTaskScheduler {
        public MyTaskScheduler() {
        }
        public MyTaskScheduler(ScheduledExecutorService scheduledExecutor) {
            super(scheduledExecutor);
        }
        public MyTaskScheduler(Executor concurrentExecutor, ScheduledExecutorService scheduledExecutor) {
            super(concurrentExecutor, scheduledExecutor);
        }
        // TODO override other methods
        @Override
        public ScheduledFuture<?> schedule(Runnable task, Trigger trigger) {
            return super.schedule(decorateTask(task), trigger);
        }
        private Runnable decorateTask(Runnable task) {
            // not 100% sure about safety of this cast
            return new MyRunnable((ScheduledMethodRunnable) task);
        }
        private static class MyRunnable implements Runnable {
            private final ScheduledMethodRunnable runnable;
            private final AtomicLong counter = new AtomicLong();
            public MyRunnable(ScheduledMethodRunnable runnable) {
                this.runnable = runnable;
            }
            @Override
            public void run() {
                System.out.println(runnable.getMethod().toGenericString() + " " + counter.incrementAndGet());
                runnable.run();
            }
        }
    }
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        TaskScheduler taskScheduler = new MyTaskScheduler(Executors.newScheduledThreadPool(10));
        taskRegistrar.setTaskScheduler(taskScheduler);
    }
    @Scheduled(cron = "0/1 * * * * *")
    public void test() {
        System.out.println("Running task in thread " + Thread.currentThread().getId());
    }
}
| 归档时间: | 
 | 
| 查看次数: | 1714 次 | 
| 最近记录: |