2012-11-02 16 views
6

Aşağıdaki görev zamanlayıcı kurulum var: Görev sadece bir çizgi yazdırır ve 10 saniye boyunca uyurYay görev zamanlayıcısı neden önceki görevin bitmesini bekler?

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

. Bu kurulumla, benim beklentim, bir önceki görevin infazını bitirip bitirmediğine bakılmaksızın (yani, durdurulan uyku), görevin her 5 saniyede bir çalışacağıydı. Ama durum böyle değil, görev 15 saniyede bir kez çalışıyor (uyku zamanı ve daha sonra cron vurulduğunda).

Bir önceki uygulamanın bitip bitmediğine bakılmaksızın, görevin her 5 saniyede bir çalışmasını sağlamak için bunu nasıl yapılandırabilirim?

cevap

9

Eğer yöntem koymak @Async notunu çalıştırın ve

@Async 
    public void run{ 

    } 

bakın veya yapabilirsiniz

bu Ardından

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

Kişisel sınıf

package foo.bar; 

public class Task{ 

    public void fooMethod(){ 
    // do task 
} 

} 

Eklendi olarak deneyin yılında istek başına

<!-- 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 
    } 

} 

Sen şartının bu özelleştirmek olabilir

+0

Cevabınız için teşekkür ederiz. _ @ Async_ çalışır. TimerFactoryBean kullanımdan kaldırıldı, bu yüzden kullanmak istemiyorum. Kural olarak, yay kodunu/ek açıklamaları kodumdan uzak tutmak isterim. _ @ Async_ eşdeğeriyle yapılandırmanın bir yolu var mı? – GuerillaNerd

+0

Evet, bazı yapılandırma ve olası java sınıflarını ekledim. – Suranga

0

Birden cron işleri izin parçacığı havuzu boyutunu artırabilir aynı anda çalıştırmak için.

<task:scheduler id="taskScheduler" pool-size="10"/> 
İlgili konular