Несколько запланированных задач Spring 3.2 не будут выполняться параллельно

У меня есть две запланированные задачи, которые я хочу запустить параллельно. Эти две задачи выполняют задание Spring Batch. Один каждые 15 секунд, а другой каждые 3 секунды. Проблема в том, что один будет запущен, а другой заблокирован до завершения.

Кажется, я нигде не могу найти аналогичный вопрос или пример. Любые идеи? Спасибо, /в

Вот немного моей конфигурации. Я использую spring-task-3.2 и spring-batch-2.2 с Spring 3.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) {
        }
    }

}

person wsams    schedule 28.01.2014    source источник
comment
Я бы начал с документации Spring, а именно заголовок 25.4.3 Элемент «запланированные задачи». Теперь описывается, как указать собственный планировщик. Планировщик по умолчанию имеет только один поток в своем пуле потоков, описанный в разделе 25.4.1 Элемент 'scheduler'.   -  person Boris the Spider    schedule 28.01.2014
comment
Спасибо @BoristheSpider. Я изучаю <task:scheduler />. Проглядел это.   -  person wsams    schedule 28.01.2014


Ответы (2)


@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" />
person wsams    schedule 28.01.2014
comment
Я, конечно, не стал бы устанавливать его на 100. Все, что больше 10, обычно является ошибкой. В вашем случае 2 будет работать... - person Boris the Spider; 28.01.2014
comment
О, хорошо, я сброшу это. Не был уверен в этой части. - person wsams; 28.01.2014

Я думаю, что вы должны указать реализацию TaskExecutor в своем JobLauncher, чтобы он мог запускать задания асинхронно, вот пример конфигурации из Spring Batch Admin Context:

<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" />
person Oussama Zoghlami    schedule 29.01.2014