46

一定の間隔でバッチ ジョブを実行する必要があり、実行時にこのバッチ ジョブの時間を変更することができます。このために@Scheduled、Spring フレームワークで提供されるアノテーションに出会いました。しかし、実行時に fixedDelay の値を変更する方法がわかりません。グーグルでいろいろ調べましたが、役に立つものは何も見つかりませんでした。

4

6 に答える 6

64

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; 
}

処理中に何が起こったかについての情報を提供します。

于 2015-06-29T06:54:26.173 に答える
32

a を使用しTriggerて、次回の実行時間を動的に設定できます。

詳細については、プログラムで Spring を使用してジョブをスケジュールするに対する私の回答を参照してください。

于 2013-03-06T16:10:37.797 に答える
2

私の知る限り、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) に直接アクセスします。これにより、新しいジョブとトリガーを作成したり、スケジューラ全体を制御および監視したりできます。

于 2013-03-06T15:23:39.113 に答える