我想基于cron表达式运行作业,但是它应该在rest调用之后从数据库中查找cron表达式。
@SpringBootApplication
@EnableScheduling
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
Controller
**************
@PostMapping
@RequestMapping(value = "/addProduct")
public ResponseEntity saveProduct(@RequestBody Product product){
prodList.add(product);
startJob();
return new ResponseEntity("Product saved successfully", HttpStatus.OK);
}
@Scheduled(cron = "*/2 * * * * *")
public void startJob() {
System.out.println("printing"+ new Date());
}
一旦其余的api被点击,它就应该等待cron表达式,这可以从数据库或任何方法中获取,然后应在指定的时间开始。
它像正常的方法调用一样工作。
答案 0 :(得分:0)
您可以使控制器实现SchedulingConfigurer
,该控制器具有一个称为configureTasks()
的回调,它将在Spring启动时被调用。
在此回调中,您可以访问ScheduledTaskRegistrar
,这是一个可用于以编程方式计划任务的帮助Bean。因此,请将此辅助bean保存到控制器的内部字段中,以便您的控制器可以访问它以便以后安排新任务。
@RestController
public class MyController implements SchedulingConfigurer{
private ScheduledTaskRegistrar scheduledTaskRegistrar;
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
this.scheduledTaskRegistrar = taskRegistrar;
}
@PostMapping
@RequestMapping(value = "/addProduct")
public ResponseEntity saveProduct(@RequestBody Product product){
//.....
//Load the cron expression from database
String cronExpression = loadCronExpressionFromDatabase();
CronTask cronTask = new CronTask(() -> startJob() ,cronExpression);
scheduledTaskRegistrar.scheduleCronTask(cronTask);
return new ResponseEntity("Product saved successfully", HttpStatus.OK);
}
public void startJob() {
System.out.println("printing"+ new Date());
}
}