У меня есть требование, что я получаю список объектов из http-запроса, мне нужно ответить 202 и запланировать массив объектов для параллельной обработки.
@Configuration
@EnableAsync
public class AsyncConfiguration
{
@Bean(name = "asyncExecutor")
public Executor asyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(10);
executor.setMaxPoolSize(10);
executor.setQueueCapacity(1000);
executor.setThreadNamePrefix("AsynchThread-");
executor.initialize();
return executor;
}
}
@Service
public class AsyncService {
private static Logger log = LoggerFactory.getLogger(AsyncService.class);
@Async("asyncExecutor")
public void processEmpoyess(List<Employees> employees) throws InterruptedException
{
employees.forEach( item->{ log.info(item.name); try {
log.info("Going to sleep " + item.name);
Thread.sleep(10000); /* my business logic for each employee may take 5 to 10 seconds */
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } );
return ;
}
}
@RequestMapping(value = "/employeelistfull", method = RequestMethod.POST)
public void postAllEmployees(@RequestBody Employees employees) throws InterruptedException, ExecutionException
{
List<EmployeeAddress> listss = employees.getEmployeeList();
service.processEmpoyess(listss);
}
в моем примере у меня может быть 1000 сотрудников, и я хочу обрабатывать 10 на 10 паралельно, бизнес-логика для каждого сотрудника может занять от 5 до 10 секунд.
С моим приведенным выше кодом он назначается асинхронной задаче, но асинхронная задача выполняется одна за другой.
Итак, нужно ли мне создать еще одно асинхронное задание и назначить сотрудников? или у асинхронной задачи есть другой способ обработки списков?