2016-08-25 8 views
3

私は、トリガーしたいいくつかの他のプロセスのオーケストレーションサービスになるSpring-Bootアプリケーションを持っています。私は現在、データベースから動的にcronを引き出すSpring Schedulingを使用してセットアップしています。私はデータベースから新しいcron情報を引き出すためのプロセスをトリガするための休止メソッドを投げました。このロジックはすべて正しく動作します。唯一の「問題」は、実際の問題になる次のスケジュールされた実行まで新しいcron情報を使用しないことです。 現在のトリガを中断し、更新されたcron情報を使用して再度トリガする方法はありますか?ここは、参照するためのアプリケーションです:次の呼び出しまでの割り込みバネスケジューラータスク

package com.bts.poc; 

import org.apache.log4j.Logger; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.scheduling.Trigger; 
import org.springframework.scheduling.TriggerContext; 
import org.springframework.scheduling.annotation.EnableScheduling; 
import org.springframework.scheduling.annotation.SchedulingConfigurer; 
import org.springframework.scheduling.config.ScheduledTaskRegistrar; 
import org.springframework.scheduling.support.CronTrigger; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.bind.annotation.RestController; 

import java.util.Date; 

@SpringBootApplication 
@EnableScheduling 
@RestController 
@RequestMapping("/APSCommon/Scheduling") 
public class Application implements SchedulingConfigurer { 

    @Autowired 
    private DynamicCron dynamicCron; 
    @Autowired 
    PropertyManager propertyManager; 

    public static void main(String[] args) throws Exception { 
     SpringApplication.run(Application.class); 
    } 

    private String cronConfig() { 
     String cronTabExpression = propertyManager.getProperty("COMPANY", "JOB_NAME","CRON_EXPRESSION"); 
     return cronTabExpression; 
    } 

    @Override 
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { 
     taskRegistrar.addTriggerTask(new Runnable() { 
      @Override 
      public void run() { 
       dynamicCron.runJob(); 
      } 
     }, new Trigger() { 
      @Override 
      public Date nextExecutionTime(TriggerContext triggerContext) { 
       String cron = cronConfig(); 
       CronTrigger trigger = new CronTrigger(cron); 
       Date nextExec = trigger.nextExecutionTime(triggerContext); 
       DynamicCron.cronExpression = cron; 
       return nextExec; 
      } 
     }); 
    } 

    @RequestMapping(value = "/reloadScheduling", method = RequestMethod.GET) 
    public String reloadScheduling() { 
     PropertyManager.setResetProperties(true); 
     return "schedules will be altered next run"; 
    } 
} 
+0

これで問題は解決しますか? http://stackoverflow.com/a/13869342/6737860 –

+0

ScheduledTaskRegistrarを使用してスケジュールするときに、ScheduledFutureを取得できる方法はありません。それをもう少し調べて更新します。 –

答えて

4

だからあなたは、私が使用しています春バー​​ジョン(4.2.7.RELEASE)にScheduledFuture(S)へのアクセスを得ることができないSchedulingConfigurer-> configureTasksを使用します。私はそれを読んだいくつかの記事から、将来のための可能な機能として言及されている。私は、次の手順を実行して、この周りを得た:

package com.bts.poc; 

import com.bts.poc.service.DynamicCron; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.boot.autoconfigure.MessageSourceAutoConfiguration; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.boot.builder.SpringApplicationBuilder; 
import org.springframework.boot.context.web.SpringBootServletInitializer; 
import org.springframework.context.annotation.Bean; 
import org.springframework.scheduling.TaskScheduler; 
import org.springframework.scheduling.annotation.EnableScheduling; 
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; 
import org.springframework.scheduling.support.CronTrigger; 
import org.springframework.web.bind.annotation.*; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.TimeZone; 
import java.util.concurrent.ScheduledFuture; 

@SpringBootApplication(exclude = MessageSourceAutoConfiguration.class) 
@EnableScheduling 
@RestController 
public class Application extends SpringBootServletInitializer { 

    @Autowired 
    private DynamicCron dynamicCron; 
    @Autowired 
    private PropertyManager propertyManager; 
    private static List<ScheduledFuture> scheduledFutures = new ArrayList<>(); 
    private static final Logger LOGGER = LoggerFactory.getLogger(Application.class); 
    private static TaskScheduler scheduler; 

    @Override 
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 
     return application.sources(Application.class); 
    } 

    private String cronConfig() { 
     return propertyManager.getProperty("COMPANY", "JOB_NAME", "CRON_EXPRESSION"); 
    } 

    @RequestMapping(value = {"scheduling/start"}, method = RequestMethod.GET) 
    public @ResponseBody String startScheduling() { 
     scheduleAll(); 

     LOGGER.info("Scheduling of jobs has been started."); 
     return "Scheduling of jobs has been started."; 
    } 

    @RequestMapping(value = {"scheduling/cancel"}, method = RequestMethod.GET) 
    public @ResponseBody String cancelScheduling() { 
     cancelAll(); 

     LOGGER.info("Cancelling all scheduled jobs."); 
     return "Cancelling all scheduled jobs."; 
    } 

    private void scheduleAll() { 
     LOGGER.info("Scheduling all applications to run."); 
     cancelAll(); 

     //eventually go through the database and load all jobs to be scheduled here. 
     schedule(cronConfig()); 
    } 

    /** 
    * Cancel all the scheduled reports 
    */ 
    private void cancelAll() { 
     for (ScheduledFuture scheduledFuture : scheduledFutures) { 
      scheduledFuture.cancel(true); 
     } 
     scheduledFutures.clear(); 
    } 

    /** 
    * Schedule the scheduled report with the given cron schedule information 
    */ 
    private void schedule(String cronSchedule) { 
     TimeZone tz = TimeZone.getDefault(); 
     LOGGER.info("Setting up application {} to execute with cron string: '{}'.", cronSchedule); 
     CronTrigger trigger = new CronTrigger(cronSchedule, tz); 

     scheduler = scheduler(); 
     if (scheduler == null) { 
      LOGGER.error("Unable to schedule job as scheduler was not found"); 
      return; 
     } 

     ScheduledFuture<?> future = scheduler.schedule(new DynamicCron(), trigger); 
     scheduledFutures.add(future); 
    } 

    @Bean 
    public TaskScheduler scheduler() { 
     if (scheduler == null) { 
      ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler(); 
      scheduler.setPoolSize(10); 
      scheduler.afterPropertiesSet(); 
     } 
     return scheduler; 
    } 
} 

これは基本的にScheduledTaskRegistrarあなたはScheduledFuture(複数可)を管理できるように提供する機能を複製します。うまくいけば、これは将来誰かを助けることができる。

関連する問題