繁体   English   中英

Spring boot:如何参数化@Scheduled

[英]Spring boot: How to parameterize @Scheduled

我是 Spring 的新手,只是触及了它可以做的事情的表面。

我有一种情况,我需要使用@Scheduled注释来设置重复任务。 速率被指定为对象中的成员字段,该对象传递给封装表示任务的方法的类。

我使用了允许访问配置或环境的机制,例如@Scheduled(fixedRateString = "${some.property:default}") 这很好用。

我不知道该怎么做是将对象中的值插入到@Scheduled

例如:

class MyClass {
  private MyObject myObj;

  public MyClass(MyObject myObj) {
    this.myObj = myObj;
  }

  @Scheduled(fixedRateString = "${myObj.rate:5000}")
  private void someTask() {
    ...
  }
}

上面的代码当然不起作用,我只是举例说明我正在尝试做什么。

任何建议,将不胜感激。

不幸的是,spring bean 创建过程不会像那样读取局部变量。

您可以使用 Spring TaskScheduler 类。

本质上,您只需要定义一个线程池,您将使用它来运行计划任务(作为 bean)并运行 taskScheduler.schedule(runnable, new CronTrigger("* * * * *"))。 这里有一个详细的例子:

https://www.baeldung.com/spring-task-scheduler

是的,您可以使用@Scheduled注释通过 SpEL 表达式(自 Spring 4.3.x 起在@Scheduled注释上可用)来做到这一点。 下面是一个例子:

@Slf4j
@Configuration
@EnableScheduling
public class ExampleClass {

  static class ScheduleCalculator {
    public String calc() {
      return "5000";
    }
  }

  @Bean("scheduleCalculator")
  public ScheduleCalculator createScheduleCalculator() {
    return new ScheduleCalculator();
  }

  @Scheduled(fixedRateString = "#{scheduleCalculator.calc()}")
  public void someTask() {
    log.info("Hello world");
  }
}

但是,仅仅因为您可以这样做并不意味着您一定应该这样做。

如果您使用spring 任务调度程序,并且您可以控制用于调度的线程池,而不是依赖所有@Scheduled任务都归入的共享执行程序.

你可以这样做:

@Component
@ConfigurationProperties(prefix = "my.obj")
public class MyObject {

    private String cronExecExpr = "*/5 * * * * *";

    // getter and setter
}
class MyClass {
  private MyObject myObj;

  public MyClass(MyObject myObj) {
    this.myObj = myObj;
  }

  @Scheduled(cron = "${my.obj.cron-exec-expr:*/5 * * * * *}")
  private void someTask() {
    ...
  }
}

正如你所看到的: https : //www.baeldung.com/spring-scheduled-tasks

你可以这样做:

一个固定延迟任务:

@Scheduled(fixedDelayString = "${fixedDelay.in.milliseconds}")

固定率任务:

@Scheduled(fixedRateString = "${fixedRate.in.milliseconds}")

基于 cron 表达式的任务:

@Scheduled(cron = "${cron.expression}")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM