当前位置: 首页 > 知识库问答 >
问题:

集群中的骆驼读锁策略

宋华美
2023-03-14

我们正在尝试使用Apache Camel进行集群。到目前为止,我们在一个节点上完成了它,并且工作得很好。

一个节点:我将readlock策略设置为“changed”,它将跟踪camelLock文件的文件变化,并且只有当文件下载完成时,它才会被拿起进行处理。但是camel readlock策略“已改变”在聚类中是不鼓励的。根据camel文档,建议使用“幂等”。这就是我使用5GB文件进行测试时所发生的情况。

两个节点:我有readlock策略到'idempotent',它将文件分发到其中一个节点,但是camel甚至在文件下载完成之前就开始处理文件。

当readlock策略是幂等的时候,有没有一种方法可以阻止camel在文件下载之前进行处理?

共有1个答案

凤明朗
2023-03-14

即使“readlock=changed”和“readlock=idempotent”都导致文件使用者等待,但它们实际上解决了完全不同的用例:“readlock=changed”防止文件不完整(即仍然由某些生产者/发送者写入),“readlock=idempotent”防止文件由两条使用者路径读取。它们是由相同的选项处理的,这有点让人困惑。

首先,解决“已更改”的场景:发送方是否可以更改,以便将文件写入一个目录中,然后在写入完成后,将其复制到文件使用者监视的目录中?如果这是在您的控制下,这是一个让操作系统处理事情的好方法,而不是试图自己处理它。(这并不解决多个读取器的问题。)否则,我建议您恢复到readlock=changed

接下来,在多个读取器上,一个解决办法是只在集群的一个节点上运行此路由。有时这可能会破坏集群的目的,但很有可能您正在启动额外的节点来帮助处理其他路由,并且您可以只在一个节点上运行此特定的路由。做这样的事情有点hack,因为所有节点不再是平等的,但这仍然是一个需要考虑的选项。最简单的方法是用某个环境属性启动一个节点,将其标记为将处理文件读取的节点...或者类似的方法。

如果您确实想要多个节点上的路由,可以从使用“idempotent=true”选项开始,但这本身是不够好的。该选项使用一个存储库,在那里它记录了以前读取过的文件,默认的存储库是内存中的(即每个节点都有自己的)。因此,如果同一个文件实际上被多次接收,并且您希望跳过它,那么默认的实现是很有帮助的。但是,如果希望它跨节点工作,就必须使用不同的存储库。

一个中央存储库可以是数据库。在这种情况下,use可以使用Camel的基于JDBC或JPA的存储库。或者,你可以用像Hazelcast这样的东西。请参阅以下选项:http://camel.apache.org/idempotent-consumer.html

 类似资料:
  • 我有一条小路线,我想使用自定义的重新传递策略来重复向endpoint发送消息,但这种行为非常奇怪。看起来,重新交付政策只是在重复一个错误。我试图将所有交换发送到路由的开头,但策略不起作用,因为每次都在创建: 我做错了什么?当错误发生时,我想以间隔重复我的请求。我的骆驼版本是2.6 日志:

  • 我想在我的 Camel 2.23.2 路由上实现一些内容缓存。在研究过程中,我遇到了骆驼的JCache组件,根据文档,它应该有一个JCache政策,它将: JCachePolicy是路由周围的拦截器,它在路由完成后缓存“路由结果”(消息正文)。如果下次使用“类似”Exchange调用路由,则在Exchange上使用缓存的值,而不是执行路由 这基本上正是我正在寻找的。然而,事实证明,该策略仅适用于C

  • 我试图用序列化方法解组一个bean,它不是当前的bundle,而是一个commons components bundle。 当骆驼尝试解组我的豆子时,我收到以下错误: 22:43:11,865|ERROR|nModule-thread-1|默认错误处理程序|89-0_33-核心-0_33-06-11|交付失败的交换ID: ID-ITEM-64684-49962-1354223882336-2。交付

  • 我很难让Spring Camel获得注册为Bean的HeaderFilterStrategy类,这样就可以通过Camel路线找到它。我试图注释HeaderFilterStrategy自定义类似乎是徒劳的。。。那么如何注册这个东西,以便在运行时找到它呢? 我有一个驼峰应用程序,其中一条路线使用定制的HeaderFilterStrategy 策略类看起来像: 我注册它与骆驼使用一个简单的注册表: 我在

  • 我刚接触骆驼,需要一些指导。我需要从S3存储桶中读取一些文件。结构是这样的。 当一个特定的excel文件被放入传入的/xls文件夹(比如file1.xls)时,我需要拾取所有文件,进行一些处理并将它们放入具有相同目录结构的已处理文件夹中。 我需要使用什么组件?我试着阅读留档,但有点难以弄清楚我需要什么组件。我知道我会使用camel-aws-s3插件,但那里没有很多例子。

  • 我试图将Apache骆驼与Kafka集成在一起,并编写了一个示例程序来读取文件并写入Kafka主题。但是我这样做的时候出错了。我可以用相反的方式从Kafka主题读取并写入文件。 组织。阿帕奇。Kafka。常见的错误。SerializationException:无法转换类org的值。阿帕奇。骆驼组成部分文件将GenericFile发送到类组织。阿帕奇。Kafka。常见的序列化。在值中指定了Stri