@Scheduled (fixedDelay) Spring 3.0 ifade dili ile nasıl parametreleştirilir?


126

Zamanlanmış bir göreve açıklama eklemek için Spring 3.0 özelliğini kullanırken, fixedDelayşu anda olduğu gibi görev sınıfıma sabit olarak bağlamak yerine yapılandırma dosyamdan as parametresini ayarlamak istiyorum.

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

Ne yazık ki, Spring Expression Language (SpEL) aracılığıyla @Valuebir String nesnesi döndürdüğü görülüyor , bu da fixedDelayparametrenin gerektirdiği şekilde uzun bir değere otomatik olarak kutulanamıyor .

Yanıtlar:


26

Sanırım @Scheduledek açıklama söz konusu değil. Yani belki sizin için bir çözüm task-scheduledXML yapılandırması kullanmak olabilir . Şu örneği ele alalım ( Bahar dokümanından kopyalanmış ):

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

... veya String'den Long'a kadro işe yaramadıysa, bunun gibi bir şey:

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

Yine, bu kurulumların hiçbirini denemedim, ancak umarım size biraz yardımcı olabilir.


Teşekkürler, XML yapılandırması hile yaptı. Ek açıklamanın dize değerlerine bu kadar bağlı görünmesine biraz şaşırdım, her neyse, eski
usul

1
Yukarıdaki yapılandırma için herhangi bir Java eşdeğeri var mı?
amique

@Grzegorz Oledzki <görev: zamanlanmış> etiketi altında "someObject" değeri ne olacaktır. Bir denetleyicinin, sabit gecikme ve başlangıç ​​gecikmesi gerektiren birden fazla yöntemi varsa, bu nasıl ele alınacaktır?
Mohit Singh

423

Spring v3.2.2, bunu işlemek için orijinal 3 uzun parametreye String parametreleri ekledi. fixedDelayString, fixedRateStringVe initialDelayStringşimdi de mevcuttur.

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

3
@Avi Bu cevap OP'nin sorusundan üç yıl sonra geliyor. Soru sorulduğunda (ve kabul edilen cevap) bu özellik mevcut değildi.
medveshonok117

@ medveshonok117 Anladım. Teşekkürler
Avi

51

@ScheduledEk açıklamayı kullanabilirsiniz , ancak cronyalnızca parametre ile birlikte :

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

5 saniyelik aralığınız şu şekilde ifade edilebilir: "*/5 * * * * *" . Ancak anladığım kadarıyla 1 saniyeden daha az hassasiyet sağlayamazsınız.


9
Göstermiş olduğunuz cron ifadesi, fixedRate ile eşdeğerdir, bu da fixedDelay'den farklıdır
kod kutusu

4

Spring Boot 2'de, @Scheduledaçıklama özellikleri için Spring Expression Language (SpPL) kullanabiliriz :

@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.propertiesDosya bu şekilde görünecektir:

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

Bu kadar. İşte görev planlamasını ayrıntılı olarak açıklayan bir makale .


1

Bir fasulye tanımlayarak değeri kendiniz dönüştürebilirsiniz. Bunu denemedim ama sanırım aşağıdakine benzer yaklaşım sizin için faydalı olabilir:

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

nerede:

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

Teşekkürler, kulağa tek bir yol gibi geliyor, ama dürüst olmak gerekirse daha zarif ("yay gibi") bir çözüm umuyordum :-)
ngeek

2
Maalesef, @Scheduled annotation özniteliği fixedDelay bir (long) sabitin atanmasını gerektirdiğinden bu işe yaramaz.
ngeek

Ah, bu doğru. O halde @Scheduledek açıklamayla yapamazsınız sanırım .
Grzegorz Oledzki
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.