apache-camel - 将更改日志转换为 Apache Camel 中的实际状态

标签 apache-camel enterprise-integration

我有两个系统,称之为 A 和 B。 当 A 中某个重要的对象发生变化时,A 通过 Apache Camel 将其发送给 B。 然而,我遇到了一种情况,当 A 实际上有一个对象的更改日志时,而 B 必须只反射(reflect)对象的实际状态。 此外,A 中的更改日志可以包含“ future ”记录。 这意味着,该对象的状态更改被安排在未来的某个时刻。 系统 A 的用户可以编辑此更改日志、删除更改记录、添加具有任何时间戳(过去和将来)的新更改记录,甚至更新现有更改。 当然,A会将这些变化记录发送给B,但B只需要对象的实际状态即可。

请注意,我可以从 A 查询对象,但 A 是一个性能关键系统,因此我不会查询某些东西,因为它会导致额外的负载。 此外,用于从 A 查询数据的 API 过于复杂,我希望尽可能避免使用它。

我在这里看到两个问题。 首先是意识到更改日志记录中的特定更改是否可能导致实际状态的更改。 我打算将更改日志存储在中间数据库中。 当更改日志记录到来时,我将在中间数据库中添加/删除/更新它,然后计算对象的实际状态并将此状态发送给 B。

其次是跟踪变更计划。 除了以固定间隔(比如 15 分钟)运行定期作业外,我无法发明任何东西。 此作业将扫描从上次调用到当前调用的时间间隔内的所有记录。

我喜欢 Apache Camel 的地方在于它基于组件的方法,当您只需要连接端点并完成所有工作时,只需编写少量代码。 Apache Camel 和 EIP 中是否有针对此问题的任何预先存在的原语?

最佳答案

我实际上正在研究一个非常相似的用例,其中系统 A 发送快照和更新,这在发送到系统 B 之前需要转换。

首先,您需要触发机制,为您提供来自系统 A 的初始状态(“快照”),timer:组件可以启动一次性启动逻辑。

现在,您将收到快照数据(您没有指定方式,可能是 ftp 文件或 jms 端点)。验证数据,将其拆分为项目,并将每项数据存储在本地内存中 cache: ,正如谢尔盖在他的评论中所建议的那样,键控独特。使用合乎逻辑的过期政策(例如 48 小时)。

从那里,不断处理来自 ftp: 的“更新”数据端点。对于每个更新,您需要将更新与 cache: 中的数据匹配并确定需要将什么(以及何时)发送到系统 B。

以后需要发送给系统B的数据需要持久化到内存或者数据库中。

最后,您需要一个调度机制来确定每 15 分钟是否应发送新数据,您可以轻松使用 timer:quartz:为此。

总而言之,您可以从以下组件构建此集成:timer , cache , ftp , quartz加上一些自定义 bean/处理器来执行自定义逻辑。

主要的挑战是处理缓存的数据然后更新并制定控制机制以控制在初始连接、断开连接或您的 camel 应用程序重新启动时应该发生什么。

祝你好运;)

关于apache-camel - 将更改日志转换为 Apache Camel 中的实际状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26230899/

相关文章:

java - 拆分器返回空数组列表 Spring 集成

java - EIP/Apache Camel - 如何同时处理消息,但按组原子处理?

rest - Hub、Spoke 和 ESB 之间的区别

java - 为什么这个 Apache Camel 路由不将 JSON 转换为 XML?

java - Camel Splitter 产生 NotifyBuilder 看到的完成交换数量不正确?

java - 替换 Camel v2.16.0 中弃用的 beanRef()

apache-camel - Apache Camel : Keeping routing information completely independent of the Java Code

java - 使用 Apache Camel 进行休息调用

java - 带蓝图的 Camel 代理

spring - PayloadTypeRouter 直接发送到 Transformer 中,中间没有 channel ?