java – 为什么spring任务调度程序等待上一个任务完成?
发布时间:2020-12-14 05:49:55 所属栏目:Java 来源:网络整理
导读:我有以下任务调度程序设置: bean id="Task" class="foo.bar.Task" /bean id="TaskScheduler" class="org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler" property name="waitForTasksToCompleteOnShutdown" value="true" / property name
我有以下任务调度程序设置:
<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> 任务只打印一行并睡10秒钟.通过这种设置,我的期望是任务将每5秒运行一次,无论前一个任务是否已完成执行(即停止休眠).但情况并非如此,任务运行一次15秒(睡眠时间,然后是下次cron被击中). 如何配置此任务,以便任务每5秒运行一次,无论先前的执行是否完成? 解决方法
在你运行方法中放入@Async anotation并查看
@Async public void run{ } 或者你可以 试试这个 <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> 那你的课 package foo.bar; public class Task{ public void fooMethod(){ // do task } } 根据请求添加 <!-- 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 } } 您可以根据您的要求自定义 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |