Как сделать определенный маршрут асинхронно в Spring Boot Web API - PullRequest
0 голосов
/ 15 декабря 2018

Разработчик, я новичок в загрузке Spring, и я создаю веб-API, который даст pdf в качестве ответа, но я столкнулся с одной проблемой.Когда я одновременно использую конечную точку localhost:8080/download?param=abc.pdf со своего мобильного телефона и ноутбука, API выдает ошибку, означающую, что эта конечная точка может не работать асинхронно.Это мой MainClass, где приложение запускается

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MywebapiApplication {

    public static void main(String[] args) {
        SpringApplication.run(MywebapiApplication.class, args);
    }
}

И моя конечная точка

@RestController
public class UserController {

    String downloadfile;
    String processfile;
    @RequestMapping(value = "/download",method = RequestMethod.GET)
    public ResponseEntity<ByteArrayResource> downloadFile2(@RequestParam(value="param1", required=true) String filename) throws IOException {

        try {
            System.out.println("File name is 1 "+filename);

            //downloadfile= "R:\\"+randomstring()+".pdf";
            downloadfile= new File("static/pdf").toString()+randomstring()+".pdf";
            processfile=new File("static/pdf").toString()+randomstring()+".pdf";

            downloadUsingNIO(fillspace(filename), downloadfile);
            PDFDocument pdfDoc = new PDFDocument(downloadfile, null);
            for(int i=0;i<=pdfDoc.getPageCount()-1;i++) {
                PDFPage page = pdfDoc.getPage(i);
                double crop_width = 2000;
                double crop_height = 800;
                double x_1 = 0;
                double y_1 = 25;
                Rectangle2D.Double area = new Rectangle2D.Double(x_1, y_1, crop_width, crop_height);
                page.setCropBox(area);
            }
            pdfDoc.saveDocument(processfile);



            Path path = Paths.get(processfile);
            byte[] data = Files.readAllBytes(path);
            ByteArrayResource resource = new ByteArrayResource(data);


            return ResponseEntity.ok()
                    .header(HttpHeaders.CONTENT_DISPOSITION,
                            "attachment;filename=" + path.getFileName().toString())
                    .contentType(MediaType.APPLICATION_PDF).contentLength(data.length)
                    .body(resource);
        }
        catch (IOException ex)
        {
            System.out.println("File name is 1 "+filename);
            System.out.println("ERROR IS "+ex.toString());
            ByteArrayResource res=new ByteArrayResource("Not Found PDF".getBytes());
            return ResponseEntity.badRequest().body(res);
        }
        catch (PDFException e) {
            e.printStackTrace();
            ByteArrayResource res=new ByteArrayResource("Not Found PDF".getBytes());
            return ResponseEntity.badRequest().body(res);
        }
        finally {
            File file =new File(downloadfile);
            file.delete();
            File file1=new File(processfile);
            file1.delete();
        }

    }

Так как сделать это асинхронно, чтобы дать ответ PDF, если несколько (100) пользователь нажалэта localhost:8080/download?param1= конечная точка одновременно.PDF может быть больше по размеру, чтобы дать ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...