Как использовать выражение Cron для запуска работы весной - PullRequest
0 голосов
/ 07 июля 2019

Я хочу запустить задание на основе выражения cron, но оно должно искать выражение cron из БД после вызова rest.

@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 голосов
/ 07 июля 2019

Вы можете заставить свой контроллер реализовывать SchedulingConfigurer, который имеет обратный вызов configureTasks(), который будет вызываться при запуске Spring.

В этом обратном вызове вы можете получить доступ к ScheduledTaskRegistrar, который является вспомогательным компонентом, который может использоваться для программного планирования задачи. Таким образом, сохраните этот вспомогательный компонент во внутреннем поле контроллера, чтобы ваш контроллер мог получить к нему доступ, чтобы запланировать новую задачу позже.

@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());
    }
}
...