Я работаю над проектом Spring Boot, где я использую стороннюю библиотеку PDF (например, Spire.pdf). Тем не менее, я заметил, что память, используемая во время обработки PDF, не выпускается быстро, и это постепенно вызывает давление памяти в приложении. Я связался с поставщиком, но в настоящее время нет никакого исправления или оптимизации на их конце. Как только файл обрабатывается, подпроцесс выходит и выпускает память. Поскольку наши требования к производительности не являются строгими, это, кажется, работает локально. Считается ли этот шаблон (подразделяя новые подпроцессы Java для задач с тяжелыми ресурсами) приемлемым или рекомендуемым в реальных приложениях?@PostMapping("pdfReplace")
public void pdfReplace(HttpServletResponse response) throws Exception {
List files = FileUtil.loopFiles("/path/to/pdfs");
ObjectMapper objectMapper = new ObjectMapper();
for (File file : files) {
PdfReplaceParam param = new PdfReplaceParam();
param.setFilePath(file.getAbsolutePath());
param.setReplaceMap(Map.of("replaceBefore", "xxxx", "test", "xx"));
File tempJson = File.createTempFile("pdf_param_", ".json");
objectMapper.writeValue(tempJson, param);
String classPath = System.getProperty("java.class.path");
ProcessBuilder pb = new ProcessBuilder(
"java", "-cp", classPath, "com.example.PdfReplaceWorker", tempJson.getAbsolutePath()
);
pb.inheritIO();
Process process = pb.start();
int exitCode = process.waitFor();
if (exitCode != 0) {
log.error("Error processing file: {}", file.getName());
}
tempJson.delete();
}
}
< /code>
Рабочий класс (подпроцесс): < /p>
public class PdfReplaceWorker {
public static void main(String[] args) throws IOException {
if (args.length < 1) {
System.err.println("No JSON file path provided");
System.exit(1);
}
File jsonFile = new File(args[0]);
ObjectMapper objectMapper = new ObjectMapper();
PdfReplaceParam param = objectMapper.readValue(jsonFile, PdfReplaceParam.class);
PdfDocument doc = new PdfDocument();
try {
doc.loadFromFile(param.getFilePath());
PdfTextReplaceOptions options = new PdfTextReplaceOptions();
options.setReplaceType(EnumSet.of(ReplaceActionType.IgnoreCase, ReplaceActionType.WholeWord));
for (int i = 0; i < doc.getPages().getCount(); i++) {
PdfPageBase page = doc.getPages().get(i);
PdfTextReplacer replacer = new PdfTextReplacer(page);
replacer.setOptions(options);
param.getReplaceMap().forEach(replacer::replaceText);
}
doc.saveToFile(param.getFilePath());
System.exit(0);
} catch (Exception e) {
e.printStackTrace();
System.exit(2);
} finally {
doc.dispose();
}
}
}
< /code>
Что я делаю: < /p>
В моем контроллере Spring Boot я использую процесс создания для запуска нового процесса Java. < /li>
Подпрограммирует обработки обработки и IT -обработки. Память восстанавливает. /> Существуют ли риски в новом появлении новых JVM в серверной среде?>
Подробнее здесь: https://stackoverflow.com/questions/796 ... vy-pdf-pro
Является ли использование процесса-строителя в Java разумным обходным путем для обработки PDF с тяжелой памятью? [закрыт ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение