基于Spring Boot多线程执行器实现Drop Zone文件并行处理改造需求
多线程并行处理Drop Zone文件转换方案
改造思路
用Java的ExecutorService线程池实现并行处理,每个Drop Zone对应一个独立的任务线程,同时完成扫描、读取与文件转换操作,替代原单线程串行流程,大幅提升处理效率。
完整代码实现
import java.io.*; import java.util.Arrays; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; public class DropZoneParallelProcessor { // 待处理的Drop Zone列表 private static final List<String> DROP_ZONES = Arrays.asList( "SDS-NonK", "SDS-K", "Eco-Docs", "OneToManyPublish", "KitMergeOnly" ); // 业务方指定的输入TXT文件名 private static final String INPUT_FILE_NAME = "index file.txt"; // XML输出文件夹路径 private static final String OUTPUT_DIR = "./output"; public static void main(String[] args) { // 创建固定大小线程池,线程数与Drop Zone数量一致 ExecutorService executor = Executors.newFixedThreadPool(DROP_ZONES.size()); // 确保输出目录存在 new File(OUTPUT_DIR).mkdirs(); // 为每个Drop Zone提交独立处理任务 for (String dropZone : DROP_ZONES) { executor.submit(() -> processDropZone(dropZone)); } // 优雅关闭线程池 executor.shutdown(); try { // 等待所有任务完成,超时时间可根据业务需求调整 if (!executor.awaitTermination(1, TimeUnit.HOURS)) { executor.shutdownNow(); } } catch (InterruptedException e) { executor.shutdownNow(); Thread.currentThread().interrupt(); } } /** * 单个Drop Zone的文件处理逻辑:扫描→读取→转换为XML * @param dropZone Drop Zone的路径/名称 */ private static void processDropZone(String dropZone) { File inputFile = new File(dropZone, INPUT_FILE_NAME); if (!inputFile.exists() || !inputFile.canRead()) { System.out.printf("Drop Zone %s 未找到可读取的输入文件%n", dropZone); return; } // 生成唯一输出文件名,避免不同Drop Zone的文件冲突 String outputFileName = String.format("%s_output.xml", dropZone); File outputFile = new File(OUTPUT_DIR, outputFileName); try (BufferedReader reader = new BufferedReader(new FileReader(inputFile)); BufferedWriter writer = new BufferedWriter(new FileWriter(outputFile))) { // 写入XML头部 writer.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); writer.newLine(); writer.write("<indexFile>"); writer.newLine(); // 逐行读取TXT并转换为XML节点 String line; int lineNum = 1; while ((line = reader.readLine()) != null) { // 转义XML特殊字符,保证输出文件合法 String escapedLine = line.replace("&", "&") .replace("<", "<") .replace(">", ">") .replace("\"", """) .replace("'", "'"); writer.write(String.format(" <line number=\"%d\">%s</line>", lineNum++, escapedLine)); writer.newLine(); } // 写入XML尾部 writer.write("</indexFile>"); System.out.printf("Drop Zone %s 处理完成,输出路径:%s%n", dropZone, outputFile.getAbsolutePath()); } catch (IOException e) { System.err.printf("Drop Zone %s 处理失败:%s%n", dropZone, e.getMessage()); } } }
关键细节说明
- 线程池选型:使用
newFixedThreadPool创建与Drop Zone数量匹配的线程池,既避免线程过多导致的上下文切换开销,又保证所有任务能并行执行。 - 任务隔离:每个任务独立处理自身Drop Zone的文件,输出文件名通过Drop Zone名称区分,无资源竞争问题,无需额外加锁。
- 异常容错:单个任务的IO异常被内部捕获,不会影响其他任务执行,错误日志便于快速排查问题。
- 优雅关闭:调用
shutdown()停止接收新任务,通过awaitTermination()等待所有任务完成;超时后强制关闭,避免程序无限挂起。 - XML合法性:对TXT内容中的XML特殊字符进行转义,确保生成的XML文件符合语法规范。
内容的提问来源于stack exchange,提问作者Sabir Shaik
相关产品推荐
相关产品推荐

