Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring boot:如何参数化@Scheduled_Java_Spring Boot - Fatal编程技术网

Java Spring boot:如何参数化@Scheduled

Java Spring boot:如何参数化@Scheduled,java,spring-boot,Java,Spring Boot,我对Spring还不熟悉,对它能做些什么还只是初步了解 在这种情况下,我需要使用@Scheduled注释设置定期任务。速率指定为对象中的成员字段,该对象传递给封装表示任务的方法的类 我使用了允许访问配置或环境的机制,例如@Scheduled(fixedRateString=“${some.property:default}”);这很有效 我不知道如何将对象中的值插入到@Scheduled中 例如: class MyClass { private MyObject myObj; publ

我对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() {
    ...
  }
}
当然,上面的代码不起作用,我只是举一个例子来说明我要做的事情


任何建议都将不胜感激。

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

您可以使用Spring TaskScheduler类

实际上,您只需要定义一个线程池,用于运行调度任务(作为bean)和运行taskScheduler.schedule(runnable,new CronTrigger(“****”)。这里有一个详细的例子:


您可以执行以下操作:

@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() {
    ...
  }
}

是的,您可以使用
@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");
  }
}
然而,仅仅因为你可以这样做并不意味着你一定要这样做

如果您使用plus控制用于调度的线程池,而不是依赖所有
@Scheduled
任务都集中到的共享执行器,那么您的代码可能会更容易让将来需要维护它的人理解。

正如您所见:

您可以像下面这样做:

固定延迟任务:

@Scheduled(fixedDelayString = "${fixedDelay.in.milliseconds}")
固定状态任务:

@Scheduled(fixedRateString = "${fixedRate.in.milliseconds}")
基于cron表达式的任务:

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

我认为您无法使用注释来执行此操作。您需要以编程方式而不是声明方式来执行此操作。您能提供(或向我指出)如何执行此操作的示例吗?使用@ConfigurationProperties如何?您在对象中拥有属性,并且可以使用SpEL访问它们