2013-03-19 15 views
6

Sto creando un thread che continuerà a estrarre il blocco di record dal database e metterli in coda. Questo thread verrà avviato sul carico del server. Voglio che questo thread sia attivo tutto il tempo. Se non ci sono record nel database, voglio attendere e ricontrollare dopo un po 'di tempo. Stavo pensando di utilizzare l'utilità di pianificazione di primavera per pianificare questo, ma non sono sicuro che sia giusto perché voglio solo che il mio compito venga avviato una volta. Quale sarà il modo migliore per implementarlo in primavera?Attività di pianificazione in primavera/Java

Inoltre, ho bisogno di avere un controllo di confine che se il mio thread va giù (a causa di qualsiasi errore o condizione di eccezione) dovrebbe essere riattivato dopo un po 'di tempo.

Posso fare tutto questo in java utilizzando i metodi di comunicazione dei thread ma provando solo se c'è qualcosa disponibile in Spring o Java per tali scenari.

Qualsiasi suggerimento o puntatore aiuterà.

risposta

0

È possibile provare a utilizzare il programma di pianificazione Quartz. http://quartz-scheduler.org/ Ciò consente di specificare la durata del tempo tra le esecuzioni delle attività. È possibile impostare un flag (booleano) che dice se la classe è stata eseguita prima per evitare la duplicazione del codice che si desidera eseguire solo la "prima" volta.

0

Spring ha il supporto immediato per le attività di pianificazione. Here are for the docs per l'ultima versione 3.2.x di primavera, ma controlla i documenti per la versione che stai utilizzando. Sembra che usi Quartz sotto il cofano per le attività di pianificazione.

+0

L'ho passato ma non voglio che il mio compito venga eseguito dopo un certo periodo di tempo, ma solo una volta. Ho solo bisogno di gestire uno scenario che se i miei compiti vanno giù, come posso resuscitarlo. – Ashu

6

È possibile utilizzare l'annotazione @Scheduled per eseguire i lavori. Per prima cosa creare una classe con un metodo annotato con @Scheduled.

Classe

public class GitHubJob { 

    @Scheduled(fixedDelay = 604800000) 
    public void perform() { 
     //do Something 
    } 
} 

quindi registrare questa classe nei file di configurazione.

primavera-context.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:tx="http://www.springframework.org/schema/tx" 
xmlns:task="http://www.springframework.org/schema/task" 
xmlns:context="http://www.springframework.org/schema/context" 
xsi:schemaLocation="http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.1.xsd 
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd 
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> 

<tx:annotation-driven/> 
<task:annotation-driven scheduler="myScheduler"/> 

<task:scheduler id="myScheduler" pool-size="10"/> 
<bean id="gitHubJob" class="org.tothought.spring.jobs.GitHubJob"/> 

</beans> 

Per informazioni sulla pianificazione della visita Spring Docs.

0

Penso che il tuo requisito sia solo regolare, quale quarzo o quadro di programmazione molla supporta molto bene. ma tu vuoi creare un approccio specifico per impiantarlo. il mio suggerimento è di mantenerlo semplice e stupido. spring scheudling trarrà vantaggio dal thread di lavoro in pooling anziché eseguirlo continuamente.

A partire dalle statistiche, è facile controllare il registro della classe di lavoro. se si desidera visualizzare le statistiche nella console Web, è necessario registrare il database di accesso del lavoratore. Sono sicuro che potresti farcela facilmente in modo normale.

4
@Scheduled(fixedDelay=3600000) 
private void refreshValues() { 
    [...] 
} 

Che esegue un'attività una volta ogni ora. Deve essere nullo e non accettare argomenti. Se si utilizza la configurazione Java di Spring, sarà inoltre necessario aggiungere l'annotazione @EnableScheduling a una delle classi @Configuration.

Problemi correlati