2013-07-13 5 views
1

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) ?

Répondre

0

Je pense que je voudrais simplement supprimer le QueryFlags.NoCursorTimeout, puis le laisser expirer de temps en temps et juste redémarrer.

Questions connexes