229.8. 尾部的光标消费者的工作方式

要将光标置于可尾部的光标中,在第一次生成光标时,会将几个特殊标记信号分配给 MongoDB。创建后,光标将保持打开状态,并将在调用 MongoCursor.next() 方法时阻止,直到新数据到达。但是,如果新数据在非确定周期后没有出现,MongoDB 服务器保留自己要终止您的光标。如果您有兴趣继续使用新数据,则必须重新生成光标。为此,您必须记住离开的位置,或者您将再次占用率的其他位置。

Camel MongoDB tail 可移动的光标消费者为您处理所有这些任务。您只是向数据中增加性质的部分字段提供密钥,这样每次重新生成时,都将作为您的光标定位的标记,例如时间戳、后续 ID 等。它可以是 MongoDB 支持的任何数据类型。日期、字符串和 Integers 可以正常工作。我们在这个组件上下文中调用这种机制"tail 跟踪"。

使用者将记住此字段的最后值,以及每当要重新生成光标时,将通过一个过滤器(如 increase Field > lastValue )运行查询,以便只消耗非读数据。

设置 increasing 字段: 在端点 URI tailTrackingIncreasingField 选项上设置 increase 字段的键。在 Camel 2.10 中,它必须是数据中的顶层字段,目前还不支持此字段的嵌套导航。也就是说,"timestamp"字段是 okay,但"nested.timestamp"将无法工作。如果您需要支持嵌套增加的字段,请在 Camel JIRA 中创建一个 ticket。

光标重新生成延迟: 一个需要注意的是,如果新数据在初始发生时还没有提供,MongoDB 将立即终止光标。由于我们不想超过服务器,因此引进了 cursorRegenerationDelay 选项(默认值为 1000ms)。

例如:

from("mongodb3:myDb?database=flights&collection=cancellations&tailTrackIncreasingField=departureTime")
    .id("tailableCursorConsumer1")
    .autoStartup(false)
    .to("mock:test");

以上路由将消耗来自"flights.cancellations"功能的集合,使用 "departureTime" 作为 increasing 字段,默认的重新生成光标延迟为 1000ms。