1

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

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

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

} 
+2

Я хотел бы начать с [Spring Документации ] (http://docs.spring.io/spring/docs/3.0.x/reference/scheduling.html) - в частности заголовок _25.4.3 Элемент «запланированные задачи». Он описывает теперь, чтобы указать настраиваемый планировщик. Планировщик по умолчанию имеет только один поток в пуле потоков, описанный в разделе _25.4.1. Заголовок элемента «scheduler» element_. –

+0

Спасибо @BoristheSpider. Я смотрю '<задача: scheduler />'. Извините. – wsams

ответ

3

@BoristheSpider указал мне в правильном направлении. Необходимо настроить мои задачи следующим образом. Нужно будет настроить размер пула, но это позволяет выполнять задания в parrallel.

<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

Я думаю, что вы должны указать TaskExecutor реализацию в вашем JobLauncher, чтобы позволить ему начать работу асинхронно, вот пример конфигурации из 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" /> 

 Смежные вопросы

  • Нет связанных вопросов^_^