Как правильно обновлять в отслеживаемом файле с CSV Source

В 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, а не вручную или с другим языком.

Спасибо за помощь.

1 ответ

Решение

Источник CSV прослушивает изменения вашего файла и обрабатывает ваш файл каждый раз, когда видит его. Всякий раз, когда вы звоните Files.write(...), вы изменяете файл, CSV-источник видит это и анализирует его. Поскольку есть три обращения к Files.write(...), он будет обработан три раза источником CSV. У вас есть два способа реализовать это:

  • Выполнение массовой записи: накапливайте то, что вам нужно для записи в файл, и записывайте только в конце функции. Однако это может не соответствовать вашему дизайну и использовать больше переходной памяти.

  • Так как вы все равно полностью переписываете файл, вы можете записать свои данные в другой файл, а затем заменить старый файл новым, используя Files.move с StandardCopyOptions.ATOMIC_MOVE а также StandardCopyOptions.REPLACE_EXISTING опции.

Другие вопросы по тегам