2014-01-28 52 views
1

我有两个计划任务需要并行运行。这两个任务执行Spring Batch作业。每15秒一次,另一次3秒。问题是一个会运行,另一个会被阻塞,直到完成。多弹簧3.2计划任务不会并行运行

我似乎无法在任何地方找到类似的问题或示例。有任何想法吗?谢谢,/ w

这里有一点我的配置。我在Spring 3.2中使用了spring-task-3.2和spring-batch-2.2。

此批处理作业由mappingRunScheduler运行。其他任务runScheduler非常相似,没有共享豆。

<job id="mappingJob" xmlns="http://www.springframework.org/schema/batch"> 
    <step id="mappingStep1" next="mappingStep2"> 
     <tasklet> 
      <chunk reader="mappingItemReader" 
        processor="mappingItemProcessor" 
        writer="mappingItemWriter" commit-interval="1" /> 
     </tasklet> 
    </step>   
    <step id="mappingStep2"> 
     <tasklet ref="mappingTasklet" /> 
    </step> 
</job> 

<bean id="mappingTasklet" 
     class="com.example.repository.batch.MappingTasklet" 
     scope="prototype"> 
    <constructor-arg index="0" ref="mappingLister" /> 
</bean> 

<bean id="mappingItemWriter" 
     class="com.example.repository.batch.MappingItemWriter" scope="prototype" /> 

<bean id="mappingLister" 
     class="com.example.repository.batch.MappingLister" 
     scope="prototype"> 
    <constructor-arg index="0" ref="liveRepositoryService" /> 
</bean> 

<bean id="mappingItemProcessor" 
     class="com.example.repository.batch.MappingItemProcessor" 
     scope="prototype"> 
    <constructor-arg index="0" ref="liveRepositoryService" /> 
</bean> 

<bean id="mappingItemReader" 
     class="com.example.repository.batch.MappingItemReader" scope="step"> 
    <constructor-arg index="0"> 
     <value>#{mappingLister.getModifiedList()}</value> 
    </constructor-arg> 
</bean> 

<bean id="mappingRunScheduler" 
     class="com.example.repository.batch.MappingRunScheduler" /> 

<task:scheduled-tasks> 
    <task:scheduled ref="runScheduler" 
      method="run" cron="*/15 * * * * *" /> 
    <task:scheduled ref="mappingRunScheduler" 
      method="run" cron="*/3 * * * * *" /> 
</task:scheduled-tasks> 

MappingRunScheduler - 运行批处理作业。

@Service(value = "mappingRunScheduler") 
@Component 
public class MappingRunScheduler { 

    public MappingRunScheduler() { 
    } 

    public void run() { 
     try { 
      String uuid = new Date().toString() + "-" 
        + UUID.randomUUID().toString(); 
      JobParameters param = new JobParametersBuilder() 
        .addString("uuid", uuid) 
        .addString("job", "mapper").toJobParameters(); 
      JobExecution execution = jobLauncher.run(job, param); 
     } catch (JobExecutionAlreadyRunningException 
       | JobRestartException 
       | JobParametersInvalidException ex) { 
     } catch (JobInstanceAlreadyCompleteException ex) { 
     } 
    } 

} 
+2

我会先从[春季文档](http://docs.spring.io/spring/docs/3.0.x/reference/scheduling.html) - 特别是标题_25.4.3'scheduled-tasks'element_。它现在描述指定一个自定义调度程序。默认调度程序在其线程池中只有一个线程 - 在_25.4.1'scheduler'element_标题下描述。 –

+0

谢谢@BoristheSpider。我在研究''。忽略了。 – wsams

回答

3

@BoristheSpider指出我在正确的方向。需要像这样配置我的任务。将需要调整池大小,但这可以让作业平行运行。

<task:scheduled-tasks scheduler="batchScheduler"> 
    <task:scheduled ref="runScheduler" 
      method="run" cron="*/15 * * * * *" /> 
    <task:scheduled ref="mappingRunScheduler" 
      method="run" cron="*/3 * * * * *" /> 
</task:scheduled-tasks> 
<task:scheduler id="batchScheduler" pool-size="100" /> 
+2

我当然不会把它设置为100.超过10的任何东西通常都是错误的。在你的情况2将工作... –

+0

哦,好吧,我会打倒。不确定那部分。 – wsams

2

我认为你应该在你的JobLauncher指定TaskExecutor实现允许它异步启动作业,这里是从Spring Batch Admin上下文的配置示例:

<bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher"> 
    <property name="jobRepository" ref="jobRepository" /> 
    <property name="taskExecutor" ref="jobLauncherTaskExecutor" /> 
</bean> 

<task:executor id="jobLauncherTaskExecutor" pool-size="6" rejection-policy="ABORT" />