2014-10-07 86 views
3

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

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

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

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

我喜欢Apache Camel for是基于组件的方法,当您只需要连接端点并获得所有工作,只需少量编码即可。 在Apache Camel和EIP中,这个问题是否有预先存在的原语?

+0

你说API查询来自A的数据过于复杂。你打算如何从A获取数据? A有没有推送机制?你打算直接访问A的仓库吗?你打算修改A吗?如果是这样,为什么不添加更好的API来查询缓存机制来保护性能? – Sergey 2014-10-10 07:00:09

+0

当A检测到某个实体发生了变化时,它会将其序列化为XML并将其写入文件系统中的文件中。我使用以下消费者:'<从uri =“ftp://路径到目录”>'。另外,A有一个推送所有数据的机制,我将用它来初始加载数据。我没有A的代码,我也不能影响它的查询API,也不能缓存缓存。此外,这也是一个政策问题:如果我能证明这辆公交车不会影响A的性能,那么说服A的车主更容易接受集成巴士。 – 2014-10-10 07:10:40

+1

你的情况不是微不足道的,我不相信你可以找到任何银弹解决方案。最接近的组件AFAIK是http://camel.apache.org/cache.html。如果不适合,您可以随时使用基于数据库的解决方案,使用Camel提供的所有额外服务,例如交易,监控等 – Sergey 2014-10-10 08:13:39

回答

0

其实我的工作在一个非常类似的用例,其中系统A发送快照和发送到系统B.

首先需要之前翻译的更新,你需要触发机制,给你的系统A的初始状态(“快照”),timer:组件可以启动一次性启动逻辑。

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

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

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

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

总之,您可以从以下组件构建这种融合:timercacheftpquartz加上一些自定义bean /处理器执行定制逻辑。

主要的挑战是处理缓存的数据,然后进行更新,并找出控制机制,以便在初始连接,断开连接或重新启动骆驼应用程序时发生什么。

祝你好运;)