1

我有两个要并行运行的计划任务。这两个任务执行一个 Spring Batch 作业。每 15 秒一次,另一次每 3 秒一次。问题是一个将运行,另一个被阻塞直到它完成。

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

这是我的一些配置。我将 spring-task-3.2 和 spring-batch-2.2 与 Spring 3.2 一起使用。

此批处理作业由mappingRunScheduler. 另一个任务runScheduler非常相似,没有共享任何 bean。

<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) {
        }
    }

}
4

2 回答 2

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" />
于 2014-01-28T14:59:26.717 回答
2

我认为您应该TaskExecutor在您的中指定一个实现JobLauncher以允许它异步启动作业,这是来自Spring Batch AdminContext 的配置示例:

<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" />
于 2014-01-29T10:19:41.360 回答