一定の間隔でバッチ ジョブを実行する必要があり、実行時にこのバッチ ジョブの時間を変更することができます。このために@Scheduled
、Spring フレームワークで提供されるアノテーションに出会いました。しかし、実行時に fixedDelay の値を変更する方法がわかりません。グーグルでいろいろ調べましたが、役に立つものは何も見つかりませんでした。
6 に答える
Spring Boot では、アプリケーション プロパティを直接使用できます。
例えば:
@Scheduled(fixedDelayString = "${my.property.fixed.delay.seconds}000")
private void process() {
// your impl here
}
プロパティが定義されていない場合は、デフォルト値を設定することもできます。たとえば、デフォルト値を "60" (秒) にすることができます。
@Scheduled(fixedDelayString = "${my.property.fixed.delay.seconds:60}000")
私が発見した他のこと:
- メソッドは無効でなければなりません
- メソッドにはパラメーターが含まれていてはなりません
- その方法は
private
private
便利な可視性を使用できることがわかり、次のように使用しました。
@Service
public class MyService {
public void process() {
// do something
}
@Scheduled(fixedDelayString = "${my.poll.fixed.delay.seconds}000")
private void autoProcess() {
process();
}
}
であるため、スケジュールprivate
されたメソッドはサービスに対してローカルであり、サービスの API の一部になることはありません。
また、このアプローチにより、process()
メソッドは値を返すことができますが、メソッドが返す@Scheduled
ことはできません。たとえば、process()
メソッドは次のようになります。
public ProcessResult process() {
// do something and collect information about what was done
return processResult;
}
処理中に何が起こったかについての情報を提供します。
a を使用しTrigger
て、次回の実行時間を動的に設定できます。
詳細については、プログラムで Spring を使用してジョブをスケジュールするに対する私の回答を参照してください。
私の知る限り、Spring API では、トリガーを変更するために必要な内部にアクセスできません。ただし、代わりに Bean を手動で構成することもできます。
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail" ref="jobDetail" />
<property name="startDelay" value="10000" />
<property name="repeatInterval" value="50000" />
</bean>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="simpleTrigger" />
</list>
</property>
</bean>
次に、SchedulerFactoryBean に記載されているように:
実行時にジョブを動的に登録するには、この SchedulerFactoryBean への Bean 参照を使用して、Quartz スケジューラ (
org.quartz.Scheduler
) に直接アクセスします。これにより、新しいジョブとトリガーを作成したり、スケジューラ全体を制御および監視したりできます。