2010-04-08 3 views
93

Quando si utilizza la funzionalità di primavera 3,0 per annotare un'operazione pianificata, vorrei impostare il fixedDelay come parametro di dal mio file di configurazione, invece di hard-cablaggio nella mia classe compito, come attualmente ...Come parametrizzare @Scheduled (fixedDelay) con linguaggio di espressione Spring 3.0?

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

Sfortunatamente sembra che con lo strumento Spring Expression Language (SpEL) @Value restituisca un oggetto String che a sua volta non è in grado di essere auto-boxato su un valore lungo come richiesto dal parametro fixedDelay.

risposta

26

Credo che la @Scheduled annotazione è fuori discussione. Quindi forse una soluzione per voi sarebbe quella di utilizzare la configurazione XML task-scheduled. Consideriamo questo esempio (copiato da Spring doc):

<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 lungo non ha funzionato, qualcosa di simile sarebbe:

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

Anche in questo caso, mi rifugio' Ho provato uno di questi setup, ma spero che possa aiutarti un po '.

+0

Grazie, la configurazione XML ha fatto il trucco. Sono un po 'sorpreso che l'annotazione sembri così legata ai valori delle stringhe, comunque, io vado con la vecchia maniera ;-) – ngeek

+1

Esiste un equivalente Java per la configurazione precedente? – amique

+0

@Grzegorz Oledzki quale sarà il valore di "someObject" sotto il tag . Se un controller ha più di un metodo che richiede un ritardo fisso e un ritardo iniziale, come sarà gestito? – Moitt

0

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

<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> 
+0

Grazie, che suona come un modo, ma ad essere onesti speravo in una soluzione più elegante ("springish") :-) – ngeek

+1

Purtroppo questo non funziona, dal momento che l'annotazione @Scheduled attributo FIXEDRimossa l'attesa richiede un (lungo) costante da assegnare. – ngeek

+0

Ah, giusto. Quindi immagino che non puoi farlo con l'annotazione '@ Programmata'. –

43

È possibile utilizzare il @Scheduled annotazione, ma insieme con il solo parametro di cron:

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

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

+7

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

305

Spring v3.2.2 ha aggiunto i parametri String ai 3 parametri lunghi originali per gestirlo. , fixedRateString e initialDelayString sono ora disponibili anche.

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

Perché questo non è contrassegnato come la risposta giusta? – Avi

+0

@Avi Questa risposta arriva tre anni dopo la domanda dell'OP. Al momento della domanda (e risposta accettata) questa funzione non esisteva. – medveshonok117

+0

@ medveshonok117 Capito. Grazie – Avi