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