当前位置: 首页 > 知识库问答 >
问题:

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

娄嘉石
2023-03-14

我想基于cron表达式运行一个作业,但它应该在rest调用后从DB中查找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());
    }

一旦rest api被命中,它应该等待cron表达式,我们可以从数据库或任何方法获得它,然后它应该在指定的时间启动。

它的工作方式与普通的方法调用类似。

共有1个答案

邓丰
2023-03-14

您可以让控制器实现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());
    }
}
 类似资料:
  • 我是Spring调度器的新手。我读了很多关于@ScheduledExecutorService和TimerTask的文章。 因此,据我所知,@ScheduledExecutorService和ScheduledExecutorService的功能大部分是相同的,但如果您的代码是在spring中,那么最好在代码中使用@ScheduledExecutorService。 所以我的问题是,假设我想在15

  • null 上个月的第一天和本月的第一天 上月1日和本月第3个工作日 当前星期的星期一日期和当前星期的staturday日期。

  • 我有一个工作,需要执行两次每天在不同的时间。例如10:00和15:30。我怎样才能做到这一点?

  • 我的路线计划每月在凌晨1:00运行一次,如果我的应用程序在这段时间内关闭,就会出现问题,所以我想在应用程序启动时运行该作业。 它使用时间段(如果服务重新启动,作业将运行),但不使用cron表达式。 我试过使用以下方法,但没有成功。 从(“quartz2://scheduler?cron=0 45 15 1 1/1?”? 有人能让我知道,如果我错过了什么。

  • 我正在尝试在特定时间调用API。但有时api调用可能会失败,所以我制定了一个逻辑来检查api调用何时失败。 确认api调用失败后,我想将@Schedulercron表达式从当前cron表达式更改为15分钟后。 如何动态更改cron表达式?? 下面是我的API调用代码。

  • 我有下面的Spring作业每天运行两次,请检查我下面的cron express是否正确,每天触发两次。 我尝试了上面的表达式,但这不起作用。这是怎么回事?