При нескольких запросах api обработка старого запроса прекращается

#java #excel #apache-poi #rest

#java #excel #apache-poi #отдых

Вопрос:

я создал и rest-api в ядре java. этот API обрабатывает большое количество данных, а затем возвращает файл Excel. теперь проблема, с которой я сталкиваюсь, заключается в том, что когда я отправляю один запрос от postman, excel содержит полные данные. но когда я нажимаю несколько запросов, например, 3 запроса, используя postman, excel в первых двух запросах содержит неполные данные (только 40-60 записей вместо 100), но для последнего запроса excel снова содержит полные данные. кажется, когда я когда-либо получаю новый запрос, обработка старых запросов прекращается.

код api

     @Path("dynamictest")
    @POST
    @Produces(XLSX)
    public Object getDynamicExcelReports(ReportParams params)
            throws SQLException, IOException, IllegalAccessException, NoSuchFieldException {
        params.setUserId(getUserId());
        if (params.getMail()) {
            new Thread(() -> {
                try {
                    MimeBodyPart attachment = new MimeBodyPart();

                    attachment.setFileName("report.xlsx");
                    attachment.setDataHandler(new DataHandler(new ByteArrayDataSource(
                            Dynamic.getDynamicExcelReporttest(params).toByteArray(), "application/octet-stream")));

                    Context.getMailManager().sendMessage(
                            params.getUserId(), "Report", "The report is in the attachment.", attachment, User.class, null);
                } catch (Exception e) {
                    LOGGER.warn("Report failed", e);
                }
            }).start();
            return Response.noContent().build();
        } else {
            return Response.ok(Dynamic.getDynamicExcelReporttest(params).toByteArray())
                    .header(HttpHeaders.CONTENT_DISPOSITION, CONTENT_DISPOSITION_VALUE_XLSX).build();
        }
    }
 

функция записи в Excel

     public static ByteArrayOutputStream processExcelV2test(Collection<DynamicReport> reports, ReportParams params, RpTmplWrapper rpTmplWrapper,
            Date from, Date to, boolean isDriverReport) throws IOException, IllegalAccessException, NoSuchFieldException, SQLException {
        XSSFWorkbook workbook = new XSSFWorkbook();
        List<RpTmplTblWrapper> tblListWrapper = new ArrayList(rpTmplWrapper.getRpTmplTblWrappers());
        tblListWrapper.sort(Comparator.comparing(tblWrapper -> tblWrapper.getRpTmplTbl().getPosition()));
        tblListWrapper.forEach((tblWrapper) -> {  //loop for multiple sheets
            try {
                String sheetName = tblWrapper.getRpTmplTbl().getLabel().replaceAll("[^A-Za-z0-9]", "|");
                Sheet sheet = workbook.createSheet(sheetName);

                /**setting data in rows and columns**/

            } catch (Exception ex) {}
        });
        
        Logger.getLogger(DynamicExcelUtils.class.getName()).log(Level.WARNING, "workbook completed");
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        workbook.write(stream);
        workbook.close();
        return stream;
    }
 

любая помощь или предложение будут полезны
благодаря

Комментарии:

1. Обеспечивают ли эти запросы одни и те же параметры? Я заинтересован в предоставлении параметра, который отвечает за getMail() функцию для ответа true .

2. да, с точно такими же параметрами и рассмотрите getMail() = false , поэтому Excel отправляется в ответ не по электронной почте

3. даже если getMail() = true для нескольких вызовов поведение остается неизменным при раннем запросе неполных данных в Excel и при последнем запросе полных данных

4. Вы пытались его отладить?

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