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);
}

私の問題は、#updateFile への呼び出しごとに 1 回だけ処理されることを期待しているのに、CSV ソースによってファイルが複数回処理されていることです。

注: 今のところ、手動​​や別の言語ではなく、Java を使用してファイルを更新したいと考えています。

助けてくれてありがとう。

4

1 に答える 1

0

CSV ソースは、ファイルの変更をリッスンし、変更を確認するたびにファイルを処理します。を呼び出しているときはいつでもFiles.write(...)、ファイルを変更していると、CSV ソースはそれを見て解析します。Files.write(...) の呼び出しが 3 回あるため、CSV ソースによって 3 回処理されます。これを実装するには、次の 2 つの方法があります。

  • 一括書き込みを行う: ファイルに書き込む必要があるものを蓄積し、関数の最後にのみ書き込みます。ただし、これは設計に適さず、より多くの一時メモリを使用する可能性があります。

  • とにかくファイルを完全に書き換えているので、データを別のファイルに書き込んでから、およびオプションを使用Files.moveして古いファイルを新しいファイルに置き換えることができます。StandardCopyOptions.ATOMIC_MOVEStandardCopyOptions.REPLACE_EXISTING

于 2014-08-20T16:26:50.857 に答える