@Scheduledと次のようなハードコードされたcron式で約10のジョブがスケジュールされています。
@Scheduled(cron = "* * 1 * * *")
public void testMethod(){
doSomething();
}
データベースを介してこのcron式を更新し、実行時に特定のジョブを再スケジュールできるようにしたいと思います。
誰かがこれを行う方法を知っていますか?
ありがとう
実行時にジョブのスケジュールを構成する場合は、注釈_@Scheduled
_を使用できないと思います。
代わりに、春のドキュメントから独自のスケジューラを使用できます:
_scheduler.schedule(task, new CronTrigger("0 15 9-17 * * MON-FRI"));
_
次に、構成を変更する場合は、スケジュールをキャンセルして新しいスケジュールを作成できます。
TaskScheduler
return ScheduledFuture
どこかに保存する必要があり、 cancel(...)
でキャンセルできます。 メソッド。
@Scheduledはこの機能をサポートしていないと思います(興味深い実装である必要があります)。事前スケジューリング機能を使用するには、クォーツまたはその他のスケジューラソリューションを使用する必要があります。私の答えはQuartzソリューションに基づいています:@Component class ReschedulerComponent {
@Autowired
private SchedulerFactoryBean schedulerFactoryBean;
public void reSchedule(){
Trigger oldTriger = schedulerFactoryBean.getScheduler().getTrigger("my_custom_trigger");
Trigger myNewTrigger = TriggerBuilder
.newTrigger()
.forJob(jobDetail) // Name of your job
.withIdentity("my_custom_trigger")
.startAt(myNewDATE)
.withSchedule(SimpleScheduleBuilder.simpleSchedule().withMisfireHandlingInstructionFireNow())
.build();
schedulerFactoryBean.getScheduler().rescheduleJob(oldTriger.getKey(), myNewTrigger);
}
}
簡単な紹介: https://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/scheduling.html
コードを変更する必要がないようにジョブのスケジュールを構成する場合は、いくつかのconfiguration.propertiesに格納されているプロパティの値を抽出し、@Value
を使用してコードでアクセスすることをお勧めします。
UPD:このトピックが見つかりました、多分あなたはそれが役に立つと思うでしょう Spring Schedulerはcron式を動的に変更します
これは、以下に説明するように、cron expression
にproperty place holder
を指定することで実行できます。 @configuration
クラスに以下のコードを追加します。
@Bean
public PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
PropertySourcesPlaceholderConfigurer properties = new PropertySourcesPlaceholderConfigurer();
properties.setLocation(new ClassPathResource("test.properties"));
return properties;
}
これで、test.propertiesがプレースホルダーで使用できるようになります。以下に示すTest.properties
variable.name.inside.properties= 00 39 05 * * *
次に、スケジューラクラス内に追加します
@Scheduled(cron = "${variable.name.inside.properties}")
public void testMethod(){
doSomething();
}
このリソースを確認する必要があると思います。プログラムでスケジュールされたジョブを作成できます。したがって、メソッドに@PostConstruct
アノテーションを付けると、アプリケーションの起動時にメソッドが選択され、スケジュールされた時間に実行されます。
http://www.quartz-scheduler.org/api/2.2.1/org/quartz/impl/triggers/SimpleTriggerImpl.html