Ho un requisito per eseguire un processo batch a un intervallo fisso e avere la possibilità di modificare l'ora di questo processo batch in fase di esecuzione. Per questo mi sono imbattuto nell'annotazione programmata fornita da Spring Framework. Ma non sono sicuro di come cambierei il valore di fixedDelay in fase di runtime. Ho fatto qualche ricerca su google, ma non ho trovato nulla di utile.Come modificare Spring @Scheduled fixedDelay a runtime
risposta
È possibile utilizzare un Trigger
per impostare dinamicamente il successivo tempo di esecuzione. Vedere la mia risposta qui:
Scheduling a job with Spring programmatically (with fixedRate set dynamically)
AFAIK l'API di primavera non ti consente di accedere agli interni necessari per modificare il trigger. Ma si potrebbe invece configurare manualmente i fagioli:
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail" ref="jobDetail" />
<property name="startDelay" value="10000" />
<property name="repeatInterval" value="50000" />
</bean>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="simpleTrigger" />
</list>
</property>
</bean>
Poi, come documentato in SchedulerFactoryBean:
Per la registrazione dinamica di posti di lavoro in fase di esecuzione, utilizzare un riferimento fagiolo per questo SchedulerFactoryBean per ottenere l'accesso diretto al Quartz Scheduler (
org.quartz.Scheduler
). Ciò consente di creare nuovi job e trigger e anche di controllare e monitorare l'intero Pianificatore .
In avvio primavera, è possibile utilizzare una proprietà applicazione direttamente!
Ad esempio:
@Scheduled(fixedDelayString = "${my.property.fixed.delay.seconds}000")
private void process() {
// your impl here
}
Si noti che si può anche avere un valore di default nel caso in cui la proprietà non è definita, ad esempio, per avere un valore predefinito di "60" (secondi):
@Scheduled(fixedDelayString = "${my.property.fixed.delay.seconds:60}000")
Altre cose che ho scoperto:
- il metodo deve essere vuoto
- il metodo deve avere alcun parametro
- il metodo può essere
private
ho trovato essere in grado di utilizzare private
visibilità a portata di mano e lo ha utilizzato in questo modo:
@Service
public class MyService {
public void process() {
// do something
}
@Scheduled(fixedDelayString = "${my.poll.fixed.delay.seconds}000")
private void autoProcess() {
process();
}
}
Essere private
, il metodo pianificato può essere locale per il servizio e non diventare parte dell'API del servizio.
Inoltre, questo approccio consente al metodo process()
di restituire un valore, che potrebbe non essere un metodo @Scheduled
. Ad esempio, il metodo di process()
può assomigliare:
public ProcessResult process() {
// do something and collect information about what was done
return processResult;
}
di fornire alcune informazioni su quanto accaduto durante la lavorazione.
Grazie, 'fixedDelayString' è quello che stavo cercando – prettyvoid
Ottima risposta. Funziona come descritto. – flash
@Bohemain Grazie per la soluzione, ma come si aggiorna FixedDelay in fase di runtime? –
- 1. Come parametrizzare @Scheduled (fixedDelay) con linguaggio di espressione Spring 3.0?
- 2. Utilizzo di Spring @Scheduled e @Async insieme
- 3. Differenza tra * e? in Spring @Scheduled (cron = ".....")
- 4. Come modificare AndroidManifest in runtime?
- 5. Spring @Scheduled esegue l'attività due volte quando si utilizzano le annotazioni
- 6. spring @Scheduled con cron non risolve la proprietà
- 7. Come modificare il runtime della sezione web.config?
- 8. Iniezione dipendenza runtime con Spring
- 9. Imposta/ignora le proprietà di avvio Spring/Spring al runtime
- 10. possiamo modificare il livello di registrazione di log4j a runtime
- 11. Dove scaricare Spring Roo 1.2.4 runtime?
- 12. Modificare la locale in fase di runtime?
- 13. Workflow Foundation for Scheduled Process
- 14. Come modificare l'impostazione della libreria di runtime C++ in QtCreator?
- 15. Come modificare i vincoli dell'etichetta durante il runtime?
- 16. Variabile SSIS impostata a runtime
- 17. Spring 3.0 - @Transactional timeout del cambio di runtime
- 18. Spring: come eseguire la configurazione di proprietà modificabili runtime trasparente
- 19. Come modificare un MOMP POM in fase di runtime?
- 20. Eseguire l'attività @Scheduled solo su un nodo del cluster WebLogic?
- 21. Il processo cron @Scheduled di Spring si sta attivando alcuni millisecondi prima dell'ora pianificata
- 22. Come utilizzare @Configuration e @EnableScheduling insieme a Spring Batch
- 23. come modificare il livello di registro in runtime senza riavviare l'applicazione di avvio a molla
- 24. Primavera: metodo @Transactional @Scheduled getta TransactionException
- 25. Come modificare il formato predefinito in StringToDate? Spring WebFlow
- 26. non è possibile modificare NSTextField nel foglio al runtime
- 27. Come abilitare i lavori @Scheduled per profilo in primavera?
- 28. Come disabilitare il metodo @Scheduled tramite il file delle proprietà?
- 29. spring, come modificare il criterio di denominazione cglib
- 30. Come modificare il percorso di swagger-ui in spring-mvc
Vedo che hai accettato la risposta migliore, ma continuo a vedere che c'erano alcuni problemi irrisolti. Il problema NPE è stato risolto? È possibile che tu pubblichi l'intera soluzione per questo?Cheers – despot
Possibile duplicato di [Pianificazione di un lavoro con Spring a livello di codice (con fixedRate impostato dinamicamente)] (http://stackoverflow.com/questions/14630539/scheduling-a-job-with-spring-programmatically-with-fixedrate-set- dinamicamente) –