J'utilise le pilote MongoDB C# 1.8.1.20 avec Mongo 2.4.3. J'utilise la boucle infinie suivante pour interroger les nouveaux messages d'une collection plafonnée et les traiter comme ils viennent (avec un curseur tailable et des données d'attente). Cela fonctionne pour la plupart, mais en production, il semble que de temps en temps l'appel à enumerator.MoveNext() bloque et ne retourne jamais. Cela provoque le blocage de la boucle et mon application ne reçoit plus les mises à jour. Il semble se produire lorsque la connexion est fermée de façon inattendue.L'itération du curseur MongoDB bloque à jamais
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());
}
}
La fonction GetCursor fait ceci:
cursor = (MongoCursorEnumerator<QueueMessage>)collection
.FindAllAs<QueueMessage>()
.SetFlags(QueryFlags.AwaitData | QueryFlags.TailableCursor | QueryFlags.NoCursorTimeout)
.SetSortOrder(SortBy.Ascending("$natural"))
.GetEnumerator();
Pourquoi est-ce blocage pour toujours, et que puis-je faire pour vous assurer qu'il jette une exception quand il ne peut pas complète (peut-être à cause du temps) ?