我正在使用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();
为什么会永远阻塞,我该怎么做才能确保它在无法完成时抛出异常(可能是超时)?
答案 0 :(得分:0)
我想我会删除QueryFlags.NoCursorTimeout,然后让它偶尔超时并重启。