2012-11-02 12 views
6

Ho la seguente configurazione task scheduler:Perché il programma di pianificazione delle operazioni a molla attende il completamento dell'attività precedente?

<bean id="Task" class="foo.bar.Task" /> 

<bean id="TaskScheduler" 
    class="org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler"> 
    <property name="waitForTasksToCompleteOnShutdown" value="true" /> 
    <property name="poolSize" value="1000" /> 
</bean> 

<task:scheduled-tasks scheduler="TaskScheduler"> 
    <task:scheduled ref="Task" method="run" cron="*/5 * * * * *" /> 
</task:scheduled-tasks> 

La task si limita a stampare una linea e dorme per 10 secondi. Con questa configurazione, la mia aspettativa era che l'attività fosse eseguita ogni 5 secondi, indipendentemente dal fatto che l'attività precedente avesse terminato la sua esecuzione (cioè smesso di dormire). Ma non è questo il caso, l'attività viene eseguita una volta ogni 15 secondi (il tempo di sonno e poi la volta successiva che il cron viene colpito).

Come posso configurarlo in modo che l'attività venga eseguita ogni 5 secondi indipendentemente dal fatto che l'esecuzione precedente sia terminata?

risposta

9

Nel metodo si esegue mettere anotation @Async e vedere

@Async 
    public void run{ 

    } 

oppure si può

provare questo

<bean id="schedulerTask" 
     class="org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean"> 
    <property name="mytaskClass" ref="mytaskClass" /> 
    <property name="targetMethod" value="fooMethod" /> 
</bean> 

<bean id="mytaskClass" class="foo.bar.Task" /> 

<bean id="timerTask" class="org.springframework.scheduling.timer.ScheduledTimerTask"> 
    <property name="timerTask" ref="schedulerTask" /> 
    <property name="delay" value="10" /> 
    <property name="period" value="5000" /> 
</bean> 

<bean class="org.springframework.scheduling.timer.TimerFactoryBean"> 
    <property name="scheduledTimerTasks"> 
     <list> 
      <ref local="timerTask" /> 
     </list> 
    </property> 
</bean> 

allora la vostra classe

package foo.bar; 

public class Task{ 

    public void fooMethod(){ 
    // do task 
} 

} 

aggiunto come per richiesta

<!-- Thread pool related configurations --> 
    <bean name="workerThread" class="foo.WorkerThread"/> 

    <bean name="managerThread" class="foo.ManagerThread" > 
    <constructor-arg type="org.springframework.core.task.TaskExecutor" ref="taskExecutor" /> 
    <constructor-arg type="foo.process.WorkerThread" ref="workerThread"/> 
    </bean> 

    <bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor" > 
<property name="corePoolSize" value="5" /> 
<property name="maxPoolSize" value="30" /> 
<property name="queueCapacity" value="100" /> 
</bean> 
<!-- End Thread pool related configurations --> 

ManagerThread.java

public class ManagerThread { 

private TaskExecutor taskExecutor=null; 
private WorkerThread workerThread=null; 


/** 
* @param taskExecutor 
* @param workerThread 
*/ 
public ManagerThread(final TaskExecutor taskExecutor,final WorkerThread workerThread) { 

    this.taskExecutor = taskExecutor; 
    this.workerThread = workerThread; 
} 


/** 
* Create a new thread and execte the requests 
* @param parameter 
*/ 
public synchronized void fire(final Object parameter) { 
    taskExecutor.execute(new Runnable() { 
     public void run() { 
      workerThread.execute(parameter); 
     } 
    }); 
    } 

WorkerThread.java

@Component 
public class WorkerThread { 




public void execute(final Object request) { 

    // do the job 
    } 

} 

Si potrebbe personalizzare questo secondo il vostro requisito

+0

Grazie per la risposta. _ @ Async_ funziona. TimerFactoryBean è deprecato, quindi non voglio usarlo. Di regola mi piace tenere il codice sorgente/annotazioni fuori dal mio codice. C'è un modo per fare l'equivalente di _ @ Async_ tramite la configurazione? – GuerillaNerd

+0

Sì, ho aggiunto alcune configurazioni e possibili classi java. – Suranga

0

È possibile aumentare filo dimensione del pool per consentire a più posti di lavoro cron per funzionare contemporaneamente.

<task:scheduler id="taskScheduler" pool-size="10"/> 
Problemi correlati