【问题标题】:Combine Apache Camel CSV with the splitter pattern将 Apache Camel CSV 与拆分器模式相结合
【发布时间】:2016-09-23 09:32:12
【问题描述】:

我有一个大型 CSV 文件,我想以速率限制对其进行处理。 Splitter Pattern 提供了我正在寻找的东西,只是我不知道如何将它与 CSV Component 结合起来。

从拆分器文档中,您可以处理 CSV,例如:

from("file:inbox")
  .split().tokenize("\n", 1000).streaming()
     .to("activemq:queue:order");

但理想情况下,我想利用 Apache Camel CSV 组件来处理混搭,更像是:

from("file:inbox")
    .unmarshal().csv().split()
    .streaming().parallelProcessing()
    .throttle(requestsPerSecond)
    .bean(new ValidateProcess(), "validate")
    .marshal().csv().to("file:outbox");

我知道上面的代码完全错误,但希望它传达了我想要实现的目标。这完全可行吗?

【问题讨论】:

  • 您希望利用 csv() 数据格式的哪个方面?例如,您想使用它的能力将每一行解组为 Map 还是更喜欢列表?编组假定 Map 或 List 作为其输入。
  • 我想将每一行解组到List<List<String>>

标签: java csv apache-camel splitter


【解决方案1】:

因此,由于某种原因,我之前无法弄清楚这一点,我认为我的类路径没有获得对 org.apache.camel:camel-csv 的依赖存在问题。一旦我解决了一切都很好。

这就是我最终得到的结果:

final CsvDataFormat csv = new CsvDataFormat(";");
csv.setLazyLoad(true);
csv.setSkipFirstLine(true);

from(in).unmarshal(csv).split(body()).streaming().parallelProcessing()
                    .bean(validator, "validateNumber")
                    .filter(header(ValidateProcess.Valid).isEqualTo(true))
                    .throttle(tps).bean(validator, "validate")
                    .marshal().csv()
                    .to(out).log("done.").end();

基本上,我想将包含数字的CSVAPI 进行流式处理,该API 的速率限制为50 TPS,并将结果输出到csv 文件。

【讨论】:

  • 这不会拉入整个文件(作为 List> 并且仅在完整的列表列表上应用流+并行处理?或者,这是您的意图吗?另外,在使用 csv 编组之前,您是否要转换为 Map,因为这是 csv 所期望的?
猜你喜欢
  • 2014-01-01
  • 1970-01-01
  • 2018-09-29
  • 1970-01-01
  • 2023-03-26
  • 2014-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多