Spring Asynctask для обработки массива объектов - PullRequest
1 голос
/ 21 июня 2019

У меня есть требование, что я получаю список объектов из 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 секунд.

С моим приведенным выше кодом он назначается асинхронной задаче, но асинхронная задача выполняется одна за другой. Итак, нужно ли мне создать еще одно асинхронное задание и назначить сотрудников? или у асинхронной задачи есть другой способ обработки списков?

1 Ответ

1 голос
/ 21 июня 2019

Перед отправкой списка в асинхронный метод необходимо разбить список на куски.В вашем случае 10.

Вы можете использовать Google Guava с функцией разделения:

Lists.partition(java.util.List, int) 

https://guava.dev/releases/snapshot/api/docs/com/google/common/collect/Lists.html#partition-java.util.List-int-

...