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


125

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

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

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

回答:


26

@Scheduled注釈は疑わしいと思います。したがって、おそらくあなたのための解決策はtask-scheduledXML構成を使用することでしょう。この例を考えてみましょう(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>

繰り返しますが、これらの設定はまだ試していませんが、少しでもお役に立てば幸いです。


おかげで、XML構成でうまくいきました。注釈が文字列値に非常にバインドされているように見えるのに少し驚いていますが、とにかく、私は昔ながらの方法で進みます;-)
ngeek

1
上記の設定に相当するJavaはありますか?
amique

@Grzegorz Oledzki <task:scheduled>タグの下の「someObject」の値はどうなるか。コントローラーに固定遅延と初期遅延を必要とする複数のメソッドがある場合、それはどのように処理されますか?
Mohit Singh

422

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

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

3
@Aviこの回答は、OPの質問から3年後のものです。質問(および回答)の時点では、この機能は存在しませんでした。
medveshonok117 2017年

@ medveshonok117了解しました。ありがとう
Avi 2017年

51

@Scheduledアノテーションを使用できますが、cronパラメーターと一緒にのみ:

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

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


9
あなたが示したcron式はfixedRateと同等であり、fixedDelayとは異なります
codebox

4

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

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>

ありがとう、それは
一見の

2
残念ながら、これは機能しません。@ Scheduledアノテーション属性fixedDelayには、(長い)定数を割り当てる必要があるためです。
ngeek

ああ、そうです。そのため、その@Scheduledアノテーションを使用してそれを行うことはできないと思います。
Grzegorz Oledzki
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.