Come creare processo in background in webapp primavera?
-
20-09-2019 - |
Domanda
Voglio correre processo in background in parallelo con la mia web-application primavera-MVC. Ho bisogno di un modo per iniziare automaticamente il contesto di caricamento. processo in background è una classe che implementa Runnable
.
È la primavera-MVC ha alcune strutture per questo?
Soluzione
Primavera dispone di un quadro di esecuzione dell'attività completo. Vedere la parte rilevante dei documenti .
Posso suggerire di avere un bean Spring nel vostro contesto, che, una volta inizializzato, presenta il vostro Runnable
sfondo di un fagiolo SimpleAsyncTaskExecutor
. Questo è l'approccio più semplice, che è possibile rendere più complessa e capace come si vede in forma.
Altri suggerimenti
vorrei andare avanti e guardare la documentazione di pianificazione delle attività legate da skaffman, ma c'è anche un modo semplice se tutto quello che vuole veramente fare è lanciare un thread in background in fase di inizializzazione contesto.
<bean id="myRunnableThingy">
...
</bean>
<bean id="thingyThread" class="java.lang.Thread" init-method="start">
<constructor-arg ref="myRunnableThingy"/>
</bean>
Come ulteriore opzione, si può ora utilizzare funzionalità di pianificazione di primavera. Con Spring 3 o superiore, ha un cron come un'annotazione che consente di pianificare le attività da eseguire con un semplice annotazione di un metodo. E 'anche amichevole con autowiring.
In questo esempio pianificazioni un compito per ogni 2 minuti con un tempo di attesa iniziale (all'avvio) di 30 secondi. Il compito successivo verrà eseguito 2 minuti dopo il metodo completa! Se si desidera che venga eseguito ogni 2 minuti esatti, utilizzare al posto fixedInterval.
@Service
public class Cron {
private static Logger log = LoggerFactory.getLogger(Cron.class);
@Autowired
private PageService pageService;
@Scheduled(initialDelay = 30000, fixedDelay=120000) // 2 minutes
public void cacheRefresh() {
log.info("Running cache invalidation task");
try {
pageService.evict();
} catch (Exception e) {
log.error("cacheRefresh failed: " + e.getMessage());
}
}
}
Assicurarsi di aggiungere anche @EnableAsync @EnableScheduling alla classe Application per attivare questa funzione.