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