227.8. 尾部的光标消费者的工作方式
要将光标置于可尾部的光标,在首次生成光标时,几个特殊标志将向 MongoDB 发送信号。创建之后,光标将保持打开状态,并在调用 DBCursor.next () 方法时阻止,直到新数据到达为止。但是,如果新数据未发生在非确定周期后,MongoDB 服务器保留了终止您的光标的权利。如果您有兴趣继续消耗新数据,您必须重新生成光标。为此,您必须记住离开的位置,否则您将再次从顶端开始消耗。
Camel MongoDB 尾部的光标使用者将为您处理所有任务。您只需向提高性质数据中的一些字段提供密钥,这样可充当标记来定位光标每次重新生成时的标记,如时间戳、顺序 ID 等。可以是 MongoDB 支持的任何数据类型。可以使用日期、字符串和 Integers 来正常工作。在此组件上下文中,我们称为"需要跟踪"的机制。
消费者将记住此字段的最后一个值,每当光标要重新生成时,都将使用过滤器运行查询,例如: increasing Field > lastValue,以便只消耗未读取数据。
设置 increasing字段: 设置端点 URI tailTrackingIncreasingField 选项上的 increasing字段的密钥。在 Camel 2.10 中,它必须是数据的顶级字段,因为此字段的嵌套导航不被支持。也就是说,"timestamp"字段为 okay,但 "nested.timestamp" 无法正常工作。如果您需要对嵌套的增大字段的支持,请在 Camel JIRA 中创建一个 ticket。
光标回收延迟: 一个需要注意的事项是,如果新数据在初始启动时不可用,MongoDB 将立即终止光标。由于我们不想在这个情形中 重负服务器,所以引入了一个光标修复 选项(值为 1000ms。),您可以对其进行修改以符合您的需要。
例如:
from("mongodb:myDb?database=flights&collection=cancellations&tailTrackIncreasingField=departureTime")
.id("tailableCursorConsumer1")
.autoStartup(false)
.to("mock:test");
from("mongodb:myDb?database=flights&collection=cancellations&tailTrackIncreasingField=departureTime")
.id("tailableCursorConsumer1")
.autoStartup(false)
.to("mock:test");
以上路由会使用来自 "flights.cancellations" capped collection 中,使用 "departureTime" 作为增大字段,默认的 regeneration 光标延迟为 1000ms。