永远迭代MongoDB游标块

时间:2013-07-13 00:48:32

标签: mongodb mongodb-.net-driver

我正在使用MongoDB C#驱动程序1.8.1.20和Mongo 2.4.3。我使用以下无限循环来轮询来自上限集合的新消息,并在它们到来时处理它们(使用tailable游标并等待数据)。它在大多数情况下都有效,但在生产中,似乎不时调用enumerator.MoveNext()块并且永远不会返回。这会导致循环停止,我的应用程序不再接收更新。当连接意外关闭时,似乎正在发生这种情况。

while (true)
{
    try
    {
        using (MongoCursorEnumerator<QueueMessage> enumerator = GetCursor())
        {
            while (!enumerator.IsDead)
            {
                while (enumerator.MoveNext()) // This is blocking forever when connection is temporarily lost
                    this.processMessage(enumerator.Current);
            }
        }
     }
     catch (Exception ex)
     {
         Trace.TraceError("Error in the ReceiveCore loop:  " + ex.ToString());
     }
}

GetCursor函数执行此操作:

cursor = (MongoCursorEnumerator<QueueMessage>)collection
    .FindAllAs<QueueMessage>()
    .SetFlags(QueryFlags.AwaitData | QueryFlags.TailableCursor | QueryFlags.NoCursorTimeout)
    .SetSortOrder(SortBy.Ascending("$natural"))
    .GetEnumerator();

为什么会永远阻塞,我该怎么做才能确保它在无法完成时抛出异常(可能是超时)?

1 个答案:

答案 0 :(得分:0)

我想我会删除QueryFlags.NoCursorTimeout,然后让它偶尔超时并重启。