3

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

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

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

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

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

4

1 回答 1

0

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

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

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

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

稍后需要发送到系统 B 的数据需要保存在内存或数据库中。

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

总之,您可以从以下组件构建此集成:、、、timer以及cache一些自定义 bean/处理器来执行自定义逻辑。ftpquartz

主要挑战是处理缓存然后更新的数据,并为初始连接、断开连接或重新启动骆驼应用程序时应该发生的情况制定控制机制。

祝你好运 ;)

于 2015-03-03T15:26:08.673 回答