【问题标题】:What Camel EIP pattern to use to indicate EOF?用什么骆驼 EIP 模式来表示 EOF?
【发布时间】:2012-11-03 15:30:46
【问题描述】:

我有一个场景,我通过将大型日志文件摄取到基于 Camel 的 ESB 上来处理它。此总线上的第一站是处理器 - LogTransformer - 它从日志文件中逐一(实时)解析日志消息,并创建 XML sn-ps:

<log-record level="INFO" source="MyApp" .../>

这些&lt;log-record/&gt; XML sn-ps 中的每一个都被放入消息队列并被总线拾取。最终它在 MySQL 数据库中结束。

我有某些处理器,我想在日志文件完全处理后启动(所有日志记录都已转换为&lt;log-record/&gt; 并入队、由总线处理并存储到数据库)。诸如报告生成器、BI 组件等之类的东西。这些处理器在整个日志入队之前不应启动。

Camel 自动向这些处理器指示它们可以启动的方式是什么?

我能想到的最好办法是让我的LogTransformer 处理器(解析日志记录、将它们转换为&lt;log-record&gt; XML 并将它们排入队列的部分)创建一个 EOF 日志记录之后 它完成处理日志。像&lt;log-record eof="true"&gt; 这样的东西。然后它像往常一样将此消息排入队列。

当总线中的最后一个处理器(将&lt;log-record&gt; 持久化到 MySQL)遇到 EOF 日志记录时,它不会将其持久化,而是将其排入队列。

这些报告生成器、BI 组件等等待此队列中的消息启动。

这个解决方案看起来很复杂。我是 ESB 和 Camel 的新手,所以我想会有一个 EIP/处理器来处理这种情况,但我似乎找不到它。 Camel Wizard 如何构建此解决方案?

【问题讨论】:

    标签: java integration apache-camel esb


    【解决方案1】:

    看看 Splitter (http://camel.apache.org/splitter.html) 和 Aggregator (http://camel.apache.org/aggregator2.html)。聚合器可以使用 completionSize 来确定它拥有继续处理所需的所有片段。

    【讨论】:

    • 感谢@JimN (+1) - 如果我的日志文件中有 1 亿条日志记录怎么办?我不认为我可以有一个 Aggregator 在内存中保存 100M 记录!是否有任何其他解决方案可以“标记”其他可以开始执行的处理器?
    • 您的聚合器不需要聚合(缓存)所有数据记录。它可以用作哨兵来确定何时看到所有日志记录。
    猜你喜欢
    • 2020-05-16
    • 1970-01-01
    • 2012-11-10
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多