当前位置: 首页 > 知识库问答 >
问题:

Spring boot:如何参数化@Scheduled

昌正奇
2023-03-14

我对Spring还不熟悉,对它能做些什么还只是初步了解。

在这种情况下,我需要使用@Sched的注释设置一个循环任务。速率被指定为对象中的成员字段,该对象被传递给封装表示任务的方法的类。

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

我不知道如何做的是将对象中的值插入到@计划的中。

例如:

class MyClass {
  private MyObject myObj;

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

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

当然,上面的代码不起作用,我只是举一个例子来说明我要做的事情。

如有任何建议,将不胜感激。

共有3个答案

童华池
2023-03-14

你可以这样做:

@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() {
    ...
  }
}
姬心思
2023-03-14

是的,您可以使用@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任务调度器,并且您可以控制用于调度的线程池,而不是依赖共享执行器,所有@计划的任务都集中在共享执行器中,那么您的代码可能更容易被那些将来必须维护它的人所理解。

储法
2023-03-14

不幸的是,Springbean创建过程不会读取这样的局部变量。

您可以使用Spring TaskScheduler类。

本质上,您只需要定义一个线程池,用于运行调度任务(作为bean)和taskScheduler。计划(可运行,新的CronTrigger(“****”)。这里有一个详细的例子:

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

 类似资料:
  • 问题内容: 考虑以下Pytest: 该测试使用Pytest固定装置,其本身具有属性。在测试中迭代该属性,以便仅在每个in的断言均成立的情况下测试才通过。 但是,我实际上想做的是生成3个测试,其中2个应该通过,其中1个将失败。我试过了 但这导致 据我了解,在Pytest固定装置中,函数“成为”其返回值,但是在对参数进行参数化时,这似乎尚未发生。如何以所需的方式设置测试? 问题答案: 从 pytest

  • 问题内容: 您如何访问“工作流程” Jenkins作业的“此构建已参数化”部分中的设置? 测试用例 创建一个工作流作业。 启用“此构建已参数化”。 添加具有默认值的STRING PARAMETER 。 将以下代码添加到: 运行工作。 结果 问题答案: 我认为使用Workflow插件时,变量可以直接使用,而不是通过env。尝试:

  • 我有一个主类——模拟器——它使用另外两个类——生产者和评估者。生产者产生结果,而评估者评估这些结果。模拟器通过查询生产者并将结果传递给评估器来控制执行流程。 Producer和Evaluator的实际实现在运行时已知,在编译时我只知道它们的接口。下面我将粘贴接口、示例实现和模拟器类的内容。 这段代码应该编译并运行。无论选择哪个生产者实现,都应该得到相同的结果(0.82)。 编译器在以下几个地方警告

  • 我有一个类似这样的pytest测试: 现在,作为重构的一部分,我移动了这一行: 放入它自己的夹具中(在conftest.py文件中),因为它在其他地方使用。但是,除了直接导入fixture函数外,是否有其他方法在测试中引用它?我知道funcargs通常是调用fixture的方式,但是在本文中,当我想要调用fixture时,我不在测试函数中。

  • 我有以下endpoint 和下面的用注释 我希望,