2017-07-04 127 views
0

我正在尝试安排一个方法调用。我想在服务器启动后立即调度此方法调用,然后在每30秒后调用一次。春季调度固定延迟和初始延迟的作业

下面的代码:

@Configuration 
@EnableScheduling 
@EnableTransactionManagement 
public class Schedular implements SchedulingConfigurer { 
    @Override 
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { 

     taskRegistrar.setScheduler(poolScheduler()); 

     taskRegistrar.addTriggerTask(new Runnable() { 
      @Override 
      public void run() { 
       testScheduling(); 
      } 
     }, new Trigger() { 

      @Override 
      public Date nextExecutionTime(TriggerContext triggerContext) { 
       Calendar nextExecutionTime = Calendar.getInstance(); 
       nextExecutionTime.add(Calendar.SECOND, <some value from database>); 
       return nextExecutionTime.getTime(); 
      } 
     }); 
    } 

    @Bean 
    public TaskScheduler poolScheduler() { 
     ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler(); 
     scheduler.setThreadNamePrefix("poolScheduler"); 
     scheduler.setPoolSize(10); 
     return scheduler; 
    } 

    public void testScheduling(){ 
     System.out.println("Scheduling Testing"); 
    } 
} 

30秒后,下面的代码调度方法的代码在服务器启动,但服务器启动不只是后后。我知道我需要做一些其他的配置来安排方法调用服务器启动后,然后每隔30秒(或任何我想要的时间)。

我正在使用弹簧引导。任何人都可以请建议。

另外,是否有可能从数据库中获得初始和固定延迟/固定比率值。我想从数据库中设置初始值

在此先感谢。

+1

为什么不使用'@Scheduled(ini​​tialDelay = 30000,fixedRate = 30000)'?. –

+0

道歉我的错误,我应该提到,延迟值是从数据库中提取的,所以它不是常数值。我已经更新了这个问题。 – Manglesh

+1

然后,只需创建一个'PropertySource'实例,该实例从数据库读取数据并使用'initialDelayString'和'fixedRateString'来使用表达式。 –

回答

0

让我知道如果这个工作对你

@PostConstruct 
@Scheduled(fixedDelay=30000) 
public void testScheduling(){ 
    System.out.println("Scheduling Testing"); 
} 

使用@PostConstuct标注在应用程序启动后启动方法。

+0

道歉我的错误,我应该提到,延迟值是从数据库中提取的,所以它的值不是恒定的。我已经更新了这个问题。此外,如果我不把固定延迟,只把initialDelay,那么它抱怨有cron或固定延迟价值 – Manglesh