首页 > 解决方案 > 同时在不同线程上处理目录中的文件 - Java Spring

问题描述

我想使用线程同时处理目录中的所有 CSV 文件。我得到了一些东西,但文件没有被处理。其他人可以帮助我吗?似乎我的消息数组列表保持为空,并且什么也没有发生。我使用了 Executorservice,我也在使用 spring。

这是我的文件生成器类

public class FileGenerator implements MessageGenerator {

@Getter
private static List<CameraMessage> messages;

private final ExecutorService pool = Executors.newCachedThreadPool();
private static Logger logger = Logger.getLogger((FileGenerator.class.getName()));




public FileGenerator(String folderpath) {

    String dir = System.getProperty("user.dir");
    File inputfolder = new File(dir + folderpath);
    messages = new ArrayList<>();

    for (File fileEntry : inputfolder.listFiles()) {
        pool.execute((() -> {
            logger.info("pool executed");
            try {

                FileReader filereader = new FileReader(fileEntry);
                // Create csvReader object and skip first line (Header line)
                CSVReader csvReader = new CSVReaderBuilder(filereader)
                        //.withSkipLines(1)
                        .build();
                List<String[]> allData = csvReader.readAll();
                System.out.println();

                LocalDateTime dateTime = LocalDateTime.now();
                // Create message list from CSV lines
                for (String[] row : allData) {
                    CameraMessage message = new CameraMessage(
                            Integer.parseInt(row[0]),
                            row[1], dateTime,
                            Integer.parseInt(row[2]));
                    System.out.println(message.toString());
                    messages.add(message);
                }
            } catch (Exception e) {
                logger.warning(e.getMessage());
            }

        }));
    }




@Override
public CameraMessage generate() {
    if (messages.isEmpty()) {
        System.exit(0);
    }

    return messages.remove(0);

}

在这里我有我的生成器配置,因为我使用的是 spring:

@Configuration
public class GeneratorConfig {


@Value("${filemode.folder}")
private String folderpath;

    @Bean
    @ConditionalOnProperty(name="load", havingValue = "file")
    public MessageGenerator fileGenerator(){
         return new FileGenerator(folderpath);
    }

     @Bean
     @ConditionalOnProperty(name="load", havingValue = "random")
     public MessageGenerator randomMessageGenerator(){
         return new RandomMessageGenerator();
     }
 }

标签: javaspringmultithreadingfile

解决方案


推荐阅读