Come parametrizzare @Scheduled (fixedDelay) con il linguaggio delle espressioni Spring 3.0?


125

Quando utilizzo la funzionalità Spring 3.0 per annotare un'attività pianificata, vorrei impostare il fixedDelayparametro as dal mio file di configurazione, invece di collegarlo alla mia classe di attività, come attualmente ...

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

Sfortunatamente sembra che con i mezzi di Spring Expression Language (SpEL) @Valuerestituisca un oggetto String che a sua volta non è in grado di essere auto-boxato su un valore lungo come richiesto dal fixedDelayparametro.

Risposte:


26

Immagino che l' @Scheduledannotazione sia fuori discussione. Quindi forse una soluzione per te sarebbe usare la task-scheduledconfigurazione XML. Consideriamo questo esempio (copiato dal documento Spring ):

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

... o se il cast da String a Long non avesse funzionato, qualcosa del genere avrebbe:

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

Ancora una volta, non ho provato nessuna di queste configurazioni, ma spero che possa aiutarti un po '.


Grazie, la configurazione XML ha funzionato. Sono un po 'sorpreso che l'annotazione appaia così legata ai valori delle stringhe, comunque, vado con la vecchia scuola ;-)
ngeek

1
Esiste un equivalente Java per la configurazione precedente?
amique

@Grzegorz Oledzki quale sarà il valore di "someObject" nel tag <task: pianificato>. Se un controller ha più di un metodo che richiede un ritardo fisso e un ritardo iniziale, come verrà gestito?
Mohit Singh,

422

Spring v3.2.2 ha aggiunto i parametri String ai 3 parametri lunghi originali per gestirlo. fixedDelayString, fixedRateStringE initialDelayStringsono ora disponibili anche.

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

3
@Avi Questa risposta arriva tre anni dopo la domanda del PO. Al momento della domanda (e della risposta accettata) questa funzione non esisteva.
medveshonok117,

@ medveshonok117 Capito. Grazie
Avi

51

È possibile utilizzare l' @Scheduledannotazione, ma cronsolo con il parametro:

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

Il tuo intervallo di 5 secondi potrebbe essere espresso come "*/5 * * * * *". Tuttavia, a quanto ho capito, non è possibile fornire una precisione inferiore a 1 secondo.


9
L'espressione cron che hai mostrato è equivalente a fixedRate, che è diverso da fixedDelay
codebox

4

In Spring Boot 2, possiamo usare Spring Expression Language (SpPL) per le @Scheduledproprietà delle annotazioni:

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

Il application.propertiesfile sarà simile al seguente:

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

Questo è tutto. Ecco un articolo che spiega in dettaglio la pianificazione delle attività.


1

Immagino che tu possa convertire tu stesso il valore definendo un bean. Non l'ho provato , ma immagino che l'approccio simile al seguente potrebbe essere utile per te:

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

dove:

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

Grazie, sembra un modo, ma ad essere sincero speravo in una soluzione più elegante ("primaverile") :-)
ngeek

2
Sfortunatamente questo non funzionerà, poiché l'attributo di annotazione @Scheduled fixedDelay richiede l'assegnazione di una (lunga) costante.
ngeek

Ah, esatto. Quindi suppongo che non puoi farlo con l' @Scheduledannotazione allora.
Grzegorz Oledzki,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.