FileNotFoundException при создании новой темы в Java - PullRequest
0 голосов
/ 06 декабря 2018

У меня уже работает код для чтения файла Excel.Сначала API в контроллере получает файл как тип MultipartFile.Затем, по некоторым причинам, мне нужно преобразовать MultipartFile в тип файла.Вот код:

private static File convert(MultipartFile file) throws IOException {
    try {
        File convertedFile = new File(file.getOriginalFilename());
        convertedFile.createNewFile();
        FileOutputStream fos = new FileOutputStream(convertedFile);
        fos.write(file.getBytes());
        fos.close();
        return convertedFile;
    } catch (IOException e) {
        e.printStackTrace();
        throw new IOException("Error in converting the file with error message: " + e.getMessage());
    }
}

Вот класс службы, который вызвал в контроллере, который вызывает метод преобразования выше:

public void create(MultipartFile file) throws Exception {
    try {
        File newFile = convert(file);
        // rest of code
    } catch (Exception e) {
        // rest of code
    }
}

Прежде чем я попытаюсь вызвать службу вновый поток, код выше работает нормально.Но, когда я пытаюсь вызвать службу в новом потоке, как показано ниже, код сообщает java.io.FileNotFoundException (система не может найти указанный файл), и основная проблема заключается в этой строке fos.write(file.getBytes());.Вот как я создаю новый поток в контроллере:

@RequestMapping(method = RequestMethod.POST, value = "uploadfile")
public ResponseEntity<?> create(@RequestParam (value = "file", required = false) MultipartFile file) throws Exception {
    try {

        // ...other process

        // ================================== code below not work
        Thread create;

        create = new Thread() {
            public void run() {
                try {
                    service.create(file);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        };

        create.start();

        // ================================== code below not work
        Thread t1 = new Thread(new Runnable() {
            public void run() {
                try {
                    service.create(file);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
        t1.start();

        // ================================== code below not work
        new Thread(() -> {
            try {
                service.create(file);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }){{start();}};

        // ...rest of code
    } catch (Exception e) {
        // ...rest of code
    }
}

выше - это несколько способов, как я пытаюсь создать поток, но ни один из них не работает, результат с тем же исполнением.

Цель: Короче говоря, я хочу сделать чтение файла в фоновом режиме и немедленно отправить ответ клиенту после вызова службы.

1 Ответ

0 голосов
/ 06 декабря 2018

Spring поддерживает асинхронный способ, возвращая вызываемый объект.псевдокод выглядит так:

@RequestMapping(method = RequestMethod.POST, value = "uploadfile")
public Callable<ResponseEntity<?>> create(@RequestParam (value = "file", required = false) MultipartFile file) throws Exception {
    return () -> {
     try {
            service.create(file);
            return ResponseEntity.ok()
        } catch (Exception e) {
            return ResponseEntity.error( /*some error*/
            e.printStackTrace();
        }
    };
}

Вот справочник по учебнику: https://niels.nu/blog/2016/spring-async-rest.html.

еще одна справка: Как сделать асинхронный отдых с помощью Spring?

...