2017-10-03 5 views
2

は基本的に私はいくつかのcronを持っている - 私のapplication.ymlのプロパティ:春の設定アプリケーションプロパティは、プログラム

B = 0 11/15 * * * ? 

私は

@Scheduled(cron = "${B}") 
public void refresh() { 
    //Refreshing 
} 

を持つ豆RefresherBを持って、私はまた、残りのエンドポイントを持っているから、このBプロパティを更新したい

@RequestMapping("schedule") 
public boolean changeRefreshSchedule(@QueryParam("cron") String expression){ 

ここで、Bプロパティを更新してRef resherB Beanも更新を取得します。これをどうやってやりますか?私はapplication.ymlファイルを変更したくないので、実行時の値を更新するだけです。

+0

@Scheduledは一度処理され、保存されている値は変換され、いくつかのロジックが適用されているため、実際には使用できません。値を変更することができたとしても、スケジューリングロジックは影響を受けません。 – luk2302

+0

[プログラムでSpringを使用してジョブをスケジュールする(動的にfixedRateを設定する)](https://stackoverflow.com/questions/14630539/scheduling-a-job-with-spring-programmatically-with-fixedrate-set-dynamically) ) – luk2302

答えて

2

ソースコードScheduledAnnotationBeanPostProcessorを見ると、私の仮定は正しいと思われます。それは簡単にはできません。

@Scheduledで注釈を付けられたメソッドは、アプリケーションコンテキストの起動時に一度処理されるため、注釈の値が解析され、タスクがスケジュールされ、その後注釈は決して触られず/再び見られます。たとえ実際には難しい注釈の値を変更することができたとしても、春はあなたの変更された価値を知りません。

もちろん、それを処理できる独自のカスタムScheduledAnnotationBeanPostProcessorを書くことができますが、それは多くの作業になります。他のオプションには、How to change Spring's @Scheduled fixedDelay at runtimeに書かれている内容が含まれていますが、依然としてかなりの作業が必要です。外出先のソリューションはありません。

もちろん、春はあなたのメソッドをあまりにも頻繁にトリガーし、実際に何かを行うかを決めるカスタムロジックを用意しています。

+0

それは残念ですが、助けてくれてありがとう! – user2270439

関連する問題