2013-03-06 34 views
19

バッチジョブを一定間隔で実行し、実行時にこのバッチジョブの時刻を変更する必要があります。このために、私はSpringフレームワークの下で提供されている@Scheduled注釈を見つけました。しかし、私は実行時にfixedDelayの値をどのように変更するのかは分かりません。私はいくつかのグーグルで遊んだが、役に立つものは何も見つかりませんでした。実行時にSpringの@Scheduled fixedDelayを変更する方法

+0

私はあなたが最良の答えを受け入れたのを見ますが、未解決の問題がまだ残っています。 NPEの問題は解決しましたか?このためにソリューション全体を投稿することは可能ですか?Cheers – despot

+0

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

答えて

17

Triggerを使用すると、次の実行時間を動的に設定できます。ここに私の答えを参照してください:

Scheduling a job with Spring programmatically (with fixedRate set dynamically)

+0

正確に何を探していたのですか?ありがとう。 – jsf

+0

FYI - コードに「NullPointerException」バグが見つかりました。 – jsf

+0

現在のTriggerを中断し、スリープ中にその値を変更する方法はありますか? – jsf

2

AFAIK Spring APIでは、トリガーを変更するために必要な内部構造にアクセスすることはできません。しかし、あなたは代わりに手動で豆を設定できます。

その後
<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参照を使用することへの直接アクセスを取得するにはクォーツスケジューラ (org.quartz.Scheduler)。これにより、新しい ジョブとトリガを作成し、 スケジューラ全体を制御して監視することができます。

33

春ブーツでは、あなたが直接アプリケーションのプロパティを使用することができます!例えば

@Scheduled(fixedDelayString = "${my.property.fixed.delay.seconds:60}000") 
:あなたはまた、「60」(秒)のデフォルト値を持つように例えば、プロパティが定義されていない場合には、デフォルト値を持つことができること

@Scheduled(fixedDelayString = "${my.property.fixed.delay.seconds}000") 
private void process() { 
    // your impl here 
} 

注意


他のものは、私が発見さ:

  • 方法メソッドがパラメータ
  • があってはなりません
  • 方法は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の一部にはなりません。

また、この方法では、@Scheduledメソッドではない値を返すことができます。処理中に何が起こったのかについてのいくつかの情報を提供するために、

public ProcessResult process() { 
    // do something and collect information about what was done 
    return processResult; 
} 

:たとえば、あなたprocess()方法は次のように見ることができます。

+0

ありがとう、 'fixedDelayString'は私が探していたものです – prettyvoid

+0

偉大な答え。説明したように動作します。 – flash

+1

@Bohemain解決していただきありがとうございますが、fixedDelayはどのように実行時に更新されますか? –

関連する問題