我需要在计划的时间运行自定义查询。 例如:用户定义自定义查询,以便在一天的特定时间在postgres数据库上运行。我需要实现一个调度程序,该调度程序可以获取存储在数据库中并动态执行的自定义查询和计划时间。
我可以使用Spring引导程序使用Cron计划程序来计划作业,该程序将时间和日期定义为注释。但是我需要运行多个计划,以便从数据库中获取日期/时间并运行自定义查询。
答案 0 :(得分:2)
public class SchedulingConfiguration implements SchedulingConfigurer {
@Bean
public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setThreadNamePrefix("TaskScheduler");
scheduler.setPoolSize(10);
scheduler.setWaitForTasksToCompleteOnShutdown(true);
scheduler.setAwaitTerminationSeconds(20);
return scheduler;
}
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setScheduler(taskScheduler());
taskRegistrar.addTriggerTask(new Runnable() {
@Override
public void run() {
// Code which which should run at the specified executionTime( specified in nextExecutionTime(TriggerContext triggerContext))
}
}, new Trigger() {
@Override
public Date nextExecutionTime(TriggerContext triggerContext) {
Calendar nextExecutionTime = new GregorianCalendar();
Date lastActualExecutionTime = triggerContext.lastActualExecutionTime();
nextExecutionTime.setTime(lastActualExecutionTime != null ? lastActualExecutionTime : new Date());
nextExecutionTime.add(Calendar.MINUTE, 2); // runs every 2 minute and can also be read from database instead of hardcoding
return nextExecutionTime.getTime();
}
});
}
}
答案 1 :(得分:0)
请参考我的答案https://stackoverflow.com/a/56474916/10232467。如果您有固定的数据库查询时间表,这将满足您的情况。
答案 2 :(得分:0)
class Scheduler implements Runnable {
public Scheduler(TaskScheduler scheduler, String timezone, String cron) {
scheduler.schedule(this, new CronTrigger(cron, TimeZone.getTimeZone(timezone)));
}
@Override
public void run() {
//DO SOMETHING
}
}