1

感谢 JMX(Java 控制台),我尝试使用文件组件消费者端点重新启动路由。

from("file:<some dir>?noop=true")

我正在使用窃听模式通过其他文件端点记录中间数据转换。在骆驼应用程序第一次启动时,一切都很好,并且输入目录中已经存在的所有文件都被轮询和处理。

但是当我尝试通过 jmx 重新启动路由时,什么也没有发生。我尝试在重新启动路由之前手动删除 .camel 目录 - 我猜是默认的 FileIdempotentRepository 创建的,但徒劳无功。我还尝试使用 MemoryIdempotentRepository 更改 IdempotentRepository 的类型:

from("file:<somedir>?noop=true").idempotentConsumer(header("CamelFileName"), MemoryIdempotentRepository.memoryIdempotentRepository(1000))

即使我在 java 控制台中重新启动路由之前触发了此 MemoryIdempotentRepository 的 clear() 操作,重新启动后也不会从输入目录轮询任何内容。

如果我添加一个文件,它可以工作。如果已经轮询过一次的文件有持久的历史记录,那么一切都会表现得如此。

我想知道使用选项“noop=true”是否会创建一个我无法用 jmx 控制的非托管幂等存储库。

如果为 true,则不会以任何方式移动或删除文件。此选项适用于只读数据或 ETL 类型要求。如果 noop=true,Camel 也会设置 idempotent=true,以避免重复使用相同的文件。

任何想法 ?(我使用的是骆驼核心 2.21)

4

1 回答 1

2

我找到了解决我的问题的方法。我用错了idempotentConsumer;我需要在端点 URI 参数列表中初始化端点幂等消费者。

首先,在 bean 注册表中创建一个条目:

registry.put("myIdempotentRepository", MemoryIdempotentRepository.memoryIdempotentRepository(1000));

idempotentRepository然后,在端点中引用这个:

from("file:<somedire>noop=true&initialDelay=10&delay=1000&idempotentRepository=#myIdempotentRepository")

通过这样做,GenericFileEndPoint

  • 不会创建默认值idempotentRepository
  • idempotentRepository端点的给定选项添加到骆驼上下文的服务中。这意味着可以通过 JMX 对其进行管理

FileEndPoint我认为允许管理骆驼核心类中的默认幂等存储库会很有用。

于 2022-01-27T18:24:13.827 回答