0

在 ActivePivot 5.0 中,我正在监视一个包含要注入数据存储区的数据的文件。我希望有这个单一的入口点,并且文件的每次更改都会更新或插入新数据。

这是我对文件主题的配置:

@Bean
public CSVSource csvSource() {
    // Define source
    final CSVSource source = new CSVSource();

    final List<String> productFileColumns = Arrays.toList("a", "b", "c");
    final ICSVTopic myTopic = source.createTopic("myTopic", "path/to/my/file");
    myTopic.getParserConfiguration().setSeparator(";");
    source.addTopic(myTopic);

    // some configuration of the csv source (threads, ...)
    ...

    // Define channel factory
    final CSVMessageChannelFactory channelFactory = new CSVMessageChannelFactory(csvSource, datastore);
    ...

    // Listen some topics
    final Map<String, String> topicsToListen = new HashMap<>();
    topicsToListen.put("myTopic_Store", "myTopic");
    final Listen<IFileInfo, ILineReader> listener = new Listen<>(channelFactory, topicsToListen);
    listener.listen(csvSource);
}

我的代码更新文件:

public void updateFile() {
    final Path path = Paths.get("path/to/my/file");

    // Write and truncate
    Files.write(path, "1;2;3".getBytes(), StandardOpenOption.TRUNCATE_EXISTING);

    // Add another data
    Files.write(path, "4;5;6".getBytes(), StandardOpenOption.APPEND);

    // Add another data
    Files.write(path, "7;8;9".getBytes(), StandardOpenOption.APPEND);
}

我的问题是我看到 CSV 源对我的文件进行了多次处理,而我希望每次调用 #updateFile 只处理一次。

注意:现在,我想使用 Java 更新我的文件,而不是手动或使用其他语言。

谢谢您的帮助。

4

1 回答 1

0

CSV 源会监听您的文件的修改,并在每次看到一些修改时处理您的文件。每当您调用 时Files.write(...),您正在修改文件,CSV 源会看到并解析它。由于对 Files.write(...) 进行了 3 次调用,因此 CSV 源将对其进行 3 次处理。你有两种方法来实现这一点:

  • 进行批量写入:累积需要写入文件的内容,仅在函数末尾写入。然而,这可能不适合您的设计,并使用更多的瞬态内存。

  • Files.move由于无论如何您都在完全重写文件,因此您可以将数据写入另一个文件,然后使用StandardCopyOptions.ATOMIC_MOVEandStandardCopyOptions.REPLACE_EXISTING选项将旧文件替换为新文件。

于 2014-08-20T16:26:50.857 回答