【发布时间】:2013-12-16 11:17:42
【问题描述】:
我正在寻找一种基于消息聚合有条件地处理消息的方法。我已经研究了很多方法来做到这一点,但似乎 Apache Camel 不支持它。我将解释这个场景,然后是我尝试过的解决方案。
场景: 我正在尝试有条件地清理目录。我每 x 天从目录中轮询一次并获取所有文件(file://...)。我将它路由到一个聚合中,将文件聚合成一个大小(directorySize)。然后我检查这个大小是否超过了某个阈值。
这就是问题所在。如果此条件通过,我现在想删除某些文件,但我无法再访问原始消息,因为它们已聚合在新的交换中。
解决方案:
- 我尝试再次获取文件来处理它们。问题是,据我所知,您无法按需获取消费者。我尝试使用 pollEnrich,但这只会获取一个文件,而不是目录中的所有文件。
- 我试图过滤/停止父路由。这里的问题是 filter()/choice...stop()/end() 只会停止带有目录大小的聚合路由,而不是带有文件消息的父路由。我无法有条件地处理这些。
- 我尝试将聚合条件移动到另一个我会调用的路由,但这会导致与第一个解决方案相同的问题。
我考虑做的事情:
- 重写聚合策略,不仅将大小聚合,而且将文件本身聚合到 groupedExchange 中。这样我可以在检查后再次拆分聚合。我不太喜欢这个解决方案,因为它会在代码中和运行时产生大量样板。
- 将文件大小计算器移至处理器而不是聚合器。这将首先破坏使用骆驼的目的..我将手动获取文件并添加大小..对于每个文件..
- 使用 ControlBus 在该目录上动态启动删除路由。再次进行大量解决方法来实现我认为应该能够以简单的方式完成的事情。
- 我想为每条父消息设置计算大小,但我不知道如何实现?
- 另一种我没有想到的停止父路由的方法?
我有点震惊,您不能根据这些消息的聚合来优雅地过滤消息。我在 Camel 中错过了什么可以提供优雅的解决方案吗?或者这是一个最不坏的解决方案?
简单架构
消息(文件)
Message(File) --> AggregatedMessage(directorySize) --> 删除某些文件?
消息(文件)
【问题讨论】: