2015-06-16 2 views
5

У меня есть приложение для создания отчетов. Поскольку подготовка таких отчетов является тяжеловесом, они готовятся асинхронно с Spring Batch. Запросы на такие отчеты создаются через интерфейс REST с использованием HTTP.Как управлять количеством параллельных заданий пакетной весны

Цель состоит в том, что ресурс REST просто ставит в очередь выполнение и завершает выполнение отчета (as described in documentation). Таким образом, TaskExecutor было предусмотрено для JobLauncher:

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

Поскольку доклады действительно тяжеловес, только определенное число их может быть произведено в данный момент времени. Надеясь, чтобы иметь возможность настроить Spring Batch для получения 2 экземпляров только на один раз, concurrencyLimit был указан:

<bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher"> 
     <property name="jobRepository" ref="jobRepository" /> 
     <property name="taskExecutor"> 
     <bean class="org.springframework.core.task.SimpleAsyncTaskExecutor"> 
      <property name="concurrencyLimit" value="2" /> 
     </bean> 
    </property> 
</bean> 

К сожалению, когда 2 рабочих места уже работает, звонок работы запуска заблокирован: jobLauncher. run (job, builder.toJobParameters());

Видимо jobLauncher немедленно пытается выполнить задание. Я бы предположил, что это скорее очередь для выполнения, как только поток доступен. Таким образом, я мог бы масштабировать свое приложение, просто добавляя дополнительные экземпляры обработки, все из которых используют одну и ту же базу данных репозитория.

Аналогичный вопрос был asked here. Я собираюсь начать изучение Spring Batch Integration, но я не уверен, что это правильное направление.

Мое служение не кажется таким необычным для меня, не должно ли быть широко обсуждаемого шаблона для него, которого я, по-видимому, не могу найти?

Благодаря F

ответ

7

SimpleAsyncTaskExecutor не рекомендуется для интенсивного использования, поскольку она порождает новую нить с каждой задачей. Он также не поддерживает более надежные концепции, такие как объединение потоков и очередность задач.

Если вы посмотрите на ThreadPoolTaskExecutor, он поддерживает более надежную парадигму выполнения задач с такими задачами, как очередь задач и использование пула потоков вместо нереста случайных, неиспользуемых потоков.

Вы можете прочитать больше о ThreadPoolTaskExecutor в Javadoc здесь: http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/scheduling/concurrent/ThreadPoolTaskExecutor.html

+0

Кроме того, вы сможете установить число потоков в пуле потоков. – rdllopes

3

Это помогло, большое спасибо. После замены SimpleAsyncTaskExecutor у меня есть именно то, что мне нужно. Код:

@Bean 
public TaskExecutor jobLauncherTaskExecutor() { 
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); 
    executor.setMaxPoolSize(executorsPoolSize); 
    executor.setCorePoolSize(executorsPoolSize); 
    return executor; 
} 

Благодаря й

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