He estado probando el controlador oficial MongoDB C# con un conjunto de réplicas de 3 instancias. Creé una aplicación simple que accede al conjunto de réplicas en un bucle.¿Hay alguna manera de hacer que el controlador MongoDB C# automáticamente no genere una excepción EndOfStreamException cuando el servidor primario se apaga?
Mi pregunta es: ¿es posible hacer que el controlador C# vuelva a ejecutar la consulta automáticamente cuando cierro el servidor primario, sin que arroje la EndOfStreamException como lo hace ahora?
Aquí está mi código de inicialización para los MongoServerSettings:
var settings = new MongoServerSettings()
{
ConnectionMode = ConnectionMode.ReplicaSet,
ReplicaSetName = "mongors",
ReadPreference = new ReadPreference(ReadPreferenceMode.PrimaryPreferred),
SafeMode = SafeMode.True,
DefaultCredentials = new MongoCredentials("user", "password"),
Servers = new[] { new MongoServerAddress("server.net", 27020),
new MongoServerAddress("server.net", 27019),
new MongoServerAddress("server.net", 27018)}
};
Y aquí está el código en el que consultar al servidor:
while (true)
{
var server = MongoServer.Create(settings);
var db = server.GetDatabase("db");
var collection = db.GetCollection<TaggedAction>("actions");
var query = Query.EQ("_id", id);
var entity = collection.FindOne(query);
Console.WriteLine(DateTime.Now +" " + entity.ActionName);
Thread.Sleep(2500);
}
Si apago el servidor principal, el cliente lanza la siguiente excepción :
System.IO.EndOfStreamException was unhandled
HResult=-2147024858
Message=Attempted to read past the end of the stream.
Source=MongoDB.Bson
StackTrace:
at MongoDB.Bson.IO.BsonBuffer.LoadFrom(Stream stream, Int32 count) in C:\work\rstam\mongo-csharp-driver\Bson\IO\BsonBuffer.cs: line 314
at MongoDB.Bson.IO.BsonBuffer.LoadFrom(Stream stream) in C:\work\rstam\mongo-csharp-driver\Bson\IO\BsonBuffer.cs: line 281
at MongoDB.Driver.Internal.MongoConnection.ReceiveMessage(BsonBinaryReaderSettings readerSettings, IBsonSerializationOptions serializationOptions) in C:\work\rstam\mongo-csharp-driver\Driver\Internal\MongoConnection.cs: line 478
at MongoDB.Driver.MongoCursorEnumerator`1.GetReply(MongoConnection connection, MongoRequestMessage message) in C:\work\rstam\mongo-csharp-driver\Driver\Core\MongoCursorEnumerator.cs: line 296
at MongoDB.Driver.MongoCursorEnumerator`1.GetFirst() in C:\work\rstam\mongo-csharp-driver\Driver\Core\MongoCursorEnumerator.cs: line 253
at MongoDB.Driver.MongoCursorEnumerator`1.MoveNext() in C:\work\rstam\mongo-csharp-driver\Driver\Core\MongoCursorEnumerator.cs: line 141
at System.Linq.Enumerable.FirstOrDefault(IEnumerable`1 source)
at MongoDB.Driver.MongoCollection.FindOneAs(IMongoQuery query) in C:\work\rstam\mongo-csharp-driver\Driver\Core\MongoCollection.cs: line 557
at MongoDB.Driver.MongoCollection`1.FindOne(IMongoQuery query) in C:\work\rstam\mongo-csharp-driver\Driver\Core\MongoCollection.cs: line 1734
at ConsoleApplication16.Program.Main(String[] args) in Program.cs: line 53
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException:
Si me trago esta excepción y continúo con th e loop, todo funciona. Por lo tanto, puede resolver el problema y cambiar a otro servidor. Pero sería genial si el controlador pudiera manejar esto automáticamente, de modo que en ningún punto arroje la excepción. ¿Es posible?
cambiar silenciosamente los servidores parece ser una característica cuestionable para mí. No sé, pero dudo que lo tengan o que alguien debería usarlo, ya que no está claro para el conductor cuáles deberían ser las implicaciones de perder una conexión de servidor. – madmik3
El punto de los conjuntos de réplicas de MongoDB es (entre otras cosas) que puede tener conmutación por error automática en caso de fallas del servidor, cortes de red, etc. ¡Tener el controlador para manejar este escenario tendría tanto sentido! – mookid8000