web-dev-qa-db-ja.com

Spring 3.0式言語で@Scheduled(fixedDelay)をパラメータ化する方法は?

Spring 3.0機能を使用してスケジュールされたタスクに注釈を付ける場合、現在のようにタスククラスにハードワイヤリングするのではなく、設定ファイルからパラメータとしてfixedDelayを設定したい...

@Scheduled(fixedDelay = 5000)
public void readLog() {
        ...
}

残念ながら、Spring Expression Language(SpEL)の手段では@ValueはStringオブジェクトを返します。このオブジェクトは、fixedDelayパラメーターで必要な長い値に自動ボックス化することはできません。

111
ngeek

@Scheduled注釈は問題ではないと思います。したがって、おそらくあなたのための解決策は、task-scheduled XML構成を使用することです。この例を考えてみましょう( Spring doc からコピー):

<task:scheduled-tasks scheduler="myScheduler">
    <task:scheduled ref="someObject" method="readLog" 
               fixed-rate="#{YourConfigurationBean.stringValue}"/>
</task:scheduled-tasks>

...またはStringからLongへのキャストが機能しなかった場合、次のようになります。

<task:scheduled-tasks scheduler="myScheduler">
    <task:scheduled ref="someObject" method="readLog"
            fixed-rate="#{T(Java.lang.Long).valueOf(YourConfigurationBean.stringValue)}"/>
</task:scheduled-tasks>

繰り返しますが、私はこれらのセットアップのいずれも試していませんが、少しでも役立つかもしれません。

26

Spring v3.2.2では、これを処理するために、元の3つの長いパラメーターに文字列パラメーターが追加されました。 fixedDelayStringfixedRateString、およびinitialDelayStringも利用可能になりました。

@Scheduled(fixedDelayString = "${my.fixed.delay.prop}")
public void readLog() {
        ...
}
392
Mark-A

@Scheduled注釈を使用できますが、cronパラメーターのみと一緒に使用できます。

@Scheduled(cron = "${yourConfiguration.cronExpression}")

5秒の間隔は"*/5 * * * * *"と表現できます。ただし、私が理解しているように、1秒未満の精度を提供することはできません。

49
kan

Beanを定義することで、自分で値を変換できると思います。 私はそれを試していません、しかし、私はあなたに次のようなアプローチが役立つと思います:

<bean id="FixedDelayLongValue" class="Java.lang.Long"
      factory-method="valueOf">
    <constructor-arg value="#{YourConfigurationBean.stringValue}"/>
</bean>

どこ:

<bean id="YourConfigurationBean" class="...">
         <property name="stringValue" value="5000"/>
</bean>
1

Spring Boot 2では、@ScheduledアノテーションプロパティにSpring Expression Language(SpPL)を使用できます。

@Scheduled(fixedRateString = "${fixed-rate.in.milliseconds}")
public void fixedRate() {
    // do something here
}

@Scheduled(fixedDelayString = "${fixed-delay.in.milliseconds}")
public void fixedDelay() {
    // do something here
}

@Scheduled(cron = "${cron.expression}")
public void cronExpression() {
    // do something here
}

application.propertiesファイルは次のようになります。

fixed-rate.in.milliseconds=5000
fixed-delay.in.milliseconds=4000
cron.expression=0 15 5 * * FRI

それでおしまい。 記事 は、タスクスケジューリングの詳細を説明しています。

1
attacomsian