我需要以固定的间隔运行批处理作业,并能够在运行时更改此批处理作业的时间.为此,我遇到了Spring框架下提供的@Scheduled注释.但我不确定如何在运行时更改fixedDelay的值.我做了一些谷歌搜索,但没有找到任何有用的东西.
我一直在研究如何使用Java 8和spring在运行时更改作业的频率.这个问题非常有用,但并没有完全解决我的问题.
我现在可以配置下次执行作业的日期.但是如果将延迟设置为1年,那么我需要在考虑新配置之前等待1年.
我的想法是在配置值发生变化时停止计划任务(所以从另一个类开始).然后在下次执行任务时重新计算.也许有一种更简单的方法可以做到这一点.
这是我到目前为止的代码.
@Configuration
@EnableScheduling
public class RequestSchedulerConfig implements SchedulingConfigurer {
@Autowired
SchedulerConfigService schedulerConfigService;
@Bean
public RequestScheduler myBean() {
return new RequestScheduler();
}
@Bean(destroyMethod = "shutdown")
public Executor taskExecutor() {
return Executors.newScheduledThreadPool(100);
}
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setScheduler(taskExecutor());
taskRegistrar.addTriggerTask(
new Runnable() {
@Override public void run() {
myBean().startReplenishmentComputation();
}
},
new Trigger() {
@Override public Date nextExecutionTime(TriggerContext triggerContext) {
Duration d = schedulerConfigService.getIntervalFromDB();
return DateTime.now().plus(d).toDate();
}
}
);
}
}
Run Code Online (Sandbox Code Playgroud)
这就是我想做的事情.
@RestController
@RequestMapping("/api/config/scheduler")
public …Run Code Online (Sandbox Code Playgroud) 我正在使用Spring Boot并且在调度cron task数据库中存在的使用值时遇到问题.
暂时,我正在读取属性文件中的值,如下所示:
@Scheduled(cron= "${time.export.cron}")
public void performJob() throws Exception {
// do something
}
Run Code Online (Sandbox Code Playgroud)
这很好用,但我没有从属性文件中获取值,而是想从数据库表中获取它们.有可能吗?怎么样?
我约有@Scheduled和一个硬编码的cron表达式安排了约10个工作,如下所示:
@Scheduled(cron = "* * 1 * * *")
public void testMethod(){
doSomething();
}
Run Code Online (Sandbox Code Playgroud)
现在,我希望能够通过数据库更新此cron表达式,并在运行时重新计划特定的作业。
有谁知道该怎么做?
谢谢
我正在使用Spring Scheduler,如下所示。
@Scheduled(fixedDelay = ((10 * 60 * 1000) / 2))
public void runDynamic()
{
//doing my stuff
}
Run Code Online (Sandbox Code Playgroud)
现在假设我有一个这样的常数
public static final Integer VARIANCE_TIME_IN_MIN = 10;
Run Code Online (Sandbox Code Playgroud)
我想将此常量用作表达式的一部分,如下所示:
@Scheduled(fixedDelay = ((MyConstants.VARIANCE_TIME_IN_MIN * 60 * 1000) / 2))
public void runDynamic()
{
//doing my stuff
}
Run Code Online (Sandbox Code Playgroud)
但这给了我编译时错误。有任何想法吗?提前致谢..!
我有一个调度程序来清理数据库
@Scheduled(fixedDelay = @Value("#{new Long('${clean_up.period}')}"))
public void cleanStatInfoTable() {
List<StateInfo> infoLis=stateInfoRepository.findAllByCreatedDateBefore(LocalDateTime.now().minusHours(1));
stateInfoRepository.deleteInBatch(infoLis);
}
Run Code Online (Sandbox Code Playgroud)
但它会产生编译错误
不兼容的类型。找到:'org.springframework.beans.factory.annotation.Value',必需:'long'
我也尝试了表格, @Scheduled(fixedDelay = @Value("${obi.payments.state_info.clean_up.period}"))
但仍然是同样的问题
如何将long值注入到注释fixedDelay中的属性中Scheduled?
已使用注释了某些方法@Scheduled(fixedDelay=/.../),如何从数据库中获取该值?
已经具有所需的服务和存储库,只是不确定如何在此处应用该值。
java ×6
spring ×6
annotations ×1
constants ×1
cron ×1
inject ×1
java-8 ×1
jobs ×1
spring-boot ×1
spring-mvc ×1