You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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("&", "&amp;")
                                        .replace("<", "&lt;")
                                        .replace(">", "&gt;")
                                        .replace("\"", "&quot;")
                                        .replace("'", "&apos;");
                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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 15:27:07