REST Api с многопоточностью для обработки файлов в Spring Boot - PullRequest
0 голосов
/ 27 февраля 2019

Это их любой способ, чтобы я мог использовать концепцию многопоточности для параллельного вызова выполнения и ускорения выполнения для созданного @RestController, который будет принимать String и List<MultipartFile> в качестве параметров запроса, а кодработает нормально. Проблема здесь, если я анализирую один файл за другим через цикл for.Время, затраченное на исполнение, больше.

Ниже находится контроллер

@RequestMapping(value = "/csvUpload", method = RequestMethod.POST)
    public List<String> csvUpload(@RequestParam String parentPkId, @RequestParam List<MultipartFile> file)
            throws IOException {
        log.info("Entered method csvUpload() of DaoController.class");
        List<String> response = new ArrayList<String>();
        String temp = parentPkId.replaceAll("[-+.^:,]", "");
        for (MultipartFile f : file) {
            String resp = uploadService.csvUpload(temp, f);
            response.add(resp);
        }
        return response;
    }

от контроллера, я вызываю uploadService.csvUpload() метод, где я анализирую файлы один за другим, как и яиспользуя цикл For.

Ниже приведен мой класс UploadService

public String csvUpload(String parentPkId, MultipartFile file) {
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(file.getInputStream()));
            String line = "";
            int header = 0;
            while ((line = br.readLine()) != null) {
                // TO SKIP HEADER
                if(header == 0) {
                    header++;  
                    continue;
                }
                header++;
                //Use Comma As Separator
                String[] csvDataSet = line.split(",");
                //Saving it to DB

        }catch(IOException ex) {
            ex.printStackTrace();
        }
        return "Successfully Uploaded "+ file.getOriginalFilename();
    }

Как сделать этот контроллер многопоточным, чтобы параллельная и быстрая обработка.Я новичок в многопоточности, и я попробовал использовать интерфейс Callable, но метод Call() не будет принимать параметры.

любые предложения и предложения приветствуются, заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Вы можете выполнить загрузочный код, используя параллельный поток

    List<String> response = file.parallelStream().map(f -> uploadService.csvUpload(temp, f))
    .collect(Collectors.toList());

Вы можете выполнять потоки последовательно или параллельно.Когда поток выполняется параллельно, среда выполнения Java разделяет поток на несколько подпотоков.Агрегированные операции выполняют итерацию и параллельную обработку этих подпотоков, а затем объединяют результаты.

0 голосов
/ 27 февраля 2019

вам нужно создать класс, который будет реализовывать вызываемую функцию, как показано ниже, и хранить фьючерсы в списке и, наконец, обрабатывать фьючерсы, как показано ниже

public class ProcessMutlipartFile implements Callable<String>
{
   private Mutlipartfile file; 
   private String temp;
   private UploadService uploadService;
   public ProcessMutlipartFile(Mutlipartfile file,String temp, UploadService uploadService )
   {
       this.file=file;
       this.temp=temp,
       this.uploadService=uploadService;
   }

   public String call() throws Exception 
   {

    return   uploadService.csvUpload(temp, file);
    }

 }

, в вашем контроллере создать список будущих объектов

 ExecutorService executor = Executors.newFixedThreadPool(10)
List< Future<String> > futureList = new ArrayList<Future<String>>();
     .
     .
     .
         for (MultipartFile f : file) {
                    futureList.add(executor.submit(new ProcessMutlipartFile(file ,temp,uploadService));
                }

наконец-то в вашем контроллере

 for (Future f :futureList)
 {
  response.add(f.get());
  }

//shuttingdown the Executor
executor.shutdown();

надеюсь, это поможет

...