【发布时间】:2020-08-16 16:56:34
【问题描述】:
在 Spring Batch 中读取 XML 的最佳性能架构是什么?每个 XML 大小约为 300 KB,我们正在处理 100 万个。
我们目前的方法
30 个分区和 30 个网格,每个从站获得 166 个 XMLS
提交块 100
应用程序启动内存为 8 GB
在阅读器默认 Bean 范围内使用 JAXB
@StepScope
@Qualifier("xmlItemReader")
public IteratorItemReader<BaseDTO> xmlItemReader(
@Value("#{stepExecutionContext['fileName']}") List<String> fileNameList) throws Exception {
String readingFile = "File Not Found";
logger.info("----StaxEventItemReader----fileName--->" + fileNameList.toString());
List<BaseDTO> fileList = new ArrayList<BaseDTO>();
for (String filePath : fileNameList) {
try {
readingFile = filePath.trim();
Invoice bill = (Invoice) getUnMarshaller().unmarshal(new File(filePath));
UnifiedInvoiceDTO unifiedDTO = new UnifiedInvoiceDTO(bill, environment);
unifiedDTO.setFileName(filePath);
BaseDTO baseDTO = new BaseDTO();
baseDTO.setUnifiedDTO(unifiedDTO);
fileList.add(baseDTO);
} catch (Exception e) {
UnifiedInvoiceDTO unifiedDTO = new UnifiedInvoiceDTO();
unifiedDTO.setFileName(readingFile);
unifiedDTO.setErrorMessage(e);
BaseDTO baseDTO = new BaseDTO();
baseDTO.setUnifiedDTO(unifiedDTO);
fileList.add(baseDTO);
}
}
return new IteratorItemReader<>(fileList);
}
我们的问题:
- 此架构是否正确
- 与 JAXB 相比,使用 StaxEventItemReader 和 XStreamMarshaller 是否有任何性能或架构优势。
- 如何正确处理内存以避免变慢
【问题讨论】:
-
您是否考虑过为每个文件创建一个作业?就可重启性、性能、可扩展性以及让一件事做好一件事并做好的所有充分理由而言,这是 IMO 的最佳选择。
-
我们在 *.txt 文件中接收 XML 文件路径。每个 txt 文件平均有 5000 到最大 10000 个 XML 文件路径。每个 txt 文件都在创建一个 Job 和 30 个 Slave。 SELECT * FROM BATCH_JOB_EXECUTION WHERE JOB_EXECUTION_ID=13492; -- 每个 txt 文件 SELECT count(STEP_EXECUTION_ID ) FROM BATCH_STEP_EXECUTION WHERE JOB_EXECUTION_ID=13492 AND STEP_NAME NOT IN('masterStep','moveFiles'); -- 31 个奴隶
-
您能否建议一下,您是说要为每个 *.txt 文件(1 个 txt 文件中的多个 XML 文件路径)创建一个作业,并且每个从属分区将处理 1 个 XML。在这种情况下,BATCH_STEP_EXECUTION 有大量记录,因为我们有 500 万个 XMLS。
-
我添加了一个包含更多细节的答案。如果有帮助请采纳:stackoverflow.com/help/someone-answers.
标签: spring spring-boot jaxb spring-batch