簡體   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