我将 MongoDB C# 驱动程序 1.8.1.20 与 Mongo 2.4.3 一起使用。我使用以下无限循环来轮询来自上限集合的新消息并在它们到来时对其进行处理(使用可尾游标和等待数据)。它在大多数情况下都有效,但在生产中,似乎有时对 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();
为什么会永远阻塞,我该怎么做才能确保它在无法完成时抛出异常(可能是超时)?