Spring Batch ограничивает количество одновременных потоков до 10

68
3

У меня есть приложение Spring Boot с рамкой Spring Batch. Моя цель проста - запустить определенную работу одновременно. Я хочу, чтобы, допустим, запустил 15 потоков за одно и то же время и отклонил все чрезмерные. Здесь мой класс конфигурации:

import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.JobRegistry;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.configuration.support.JobRegistryBeanPostProcessor;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.core.launch.support.SimpleJobLauncher;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.task.TaskExecutor;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

@Configuration
@EnableBatchProcessing
public class GeneratingReportJobConfiguration {

@Autowired
private GeneratingReportTask task;

@Autowired
private JobRepository jobRepository;

@Autowired
private JobBuilderFactory jobBuilderFactory;

@Autowired
private StepBuilderFactory stepBuilderFactory;

@Bean
public JobRegistryBeanPostProcessor jobRegistryBeanPostProcessor(JobRegistry jobRegistry) {
JobRegistryBeanPostProcessor jobRegistryBeanPostProcessor = new JobRegistryBeanPostProcessor();
jobRegistryBeanPostProcessor.setJobRegistry(jobRegistry);
return jobRegistryBeanPostProcessor;
}

@Bean
public TaskExecutor taskExecutor() {
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
taskExecutor.setCorePoolSize(15);
taskExecutor.setMaxPoolSize(15);
taskExecutor.setQueueCapacity(0);
return taskExecutor;
}

@Bean
public JobLauncher jobLauncher(TaskExecutor taskExecutor) {
SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
jobLauncher.setJobRepository(jobRepository);
jobLauncher.setTaskExecutor(taskExecutor);
return jobLauncher;
}

@Bean
public Job job() {
return jobBuilderFactory.get("generatingReportJob")
.start(step())
.build();
}

@Bean
public Step step() {
return stepBuilderFactory.get("generatingReportTask")
.tasklet(task)
.build();
}
}

Дело в том, что я пытаюсь сделать - приложение запускает не более 10 заданий одновременно. Я пробовал экспериментировать с TaskExecutor - моим первым логическим выбором был SimpleAsyncTaskExecutor, который, казалось, SimpleAsyncTaskExecutor каждый избыточный запрос, а затем запускал их в случайном порядке, который не предназначен.

Поэтому позже я попытался манипулировать этим лимитом, и, как вы можете видеть в коде, я начал использовать ThreadPoolTaskExecutor, что позволило мне установить ограничение на 5, например, и работало как ожидалось - не более 5 потоков могли работать одновременно, а следующие были отклонены, пока эти 5 были запущены. Однако установка предела до 15 привела к поведению, аналогичному предыдущему. Тем не менее, 11-й запрос находился в очереди, в то время как 16-й был отклонен. Это почти мое намеренное поведение, однако мне нужно иметь возможность полностью контролировать выполнение потоков.

Задания @RestController через @RestController с помощью jobLauncher.run(). Каждый чрезмерный запрос приводит к загрузке браузера, пока не сможет начать выполнение. Похоже, программа замораживается где-то внутри jobLauncher.run() (когда она может начать выполнение задания, она просто выходит - то, как работает async).

спросил(а) 2018-08-09T15:28:00+03:00 1 год, 4 месяца назад
0
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема