如何在春季使用Cron表达式运行作业

时间:2019-07-07 18:13:16

标签: spring spring-boot cron scheduling taskscheduler

我想基于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表达式,这可以从数据库或任何方法中获取,然后应在指定的时间开始。

它像正常的方法调用一样工作。

1 个答案:

答案 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());
    }
}