usar pom org mongoclient mongo library example como clients java mongodb mongo-java

java - pom - cómo verificar desde un controlador, si el servidor mongoDB se está ejecutando



org mongodb mongo java driver (5)

Me pregunto si hay una forma de verificar si el servidor mongoDB se está ejecutando desde el controlador java para mongoDB.

Según el tutorial, puedo hacer

Mongo m = new Mongo(); // or Mongo m = new Mongo( "localhost" , 27017 ); // and DB db = m.getDB( "mydb" );

Pero, ¿cómo comprobar que puedo usar estos Mongo y DB? No veo ningún método isConnected () en la API.

db.getConnector().isOpen()

devuelve verdadero

La única forma que encontré es llamar a db.getDatabaseNames () y capturar MongoException.

Si hay algún enfoque más civilizado?


Si hay una forma de verificar si el servidor mongoDB se está ejecutando desde el controlador java para MongoDB?

Así que si puedes hacer lo siguiente:

Mongo m = new Mongo( "localhost" , 27017 ); DB db = m.getDB( "mydb" );

Entonces estás conectado a la base de datos, de lo contrario, m.getDB() estaría lanzando una excepción. Si puede conectarse a la base de datos, entonces el servidor MongoDB se está ejecutando .

La única forma que encontré es llamar a db.getDatabaseNames () y capturar MongoException. Si hay algún enfoque más civilizado?

¿Hay algo específicamente incorrecto con este enfoque?

El controlador básicamente se ejecuta en una caja de arena donde puede o no puede conectarse. Le está pidiendo al controlador que sepa algo específico sobre el servidor (¿se está ejecutando el proceso X? ), Pero ese no es el trabajo del controlador. Puede conectarse o no puede, no es responsable de operar el servicio / proceso, solo de conectarse a él.

Para saber que el proceso se está ejecutando realmente, necesita funciones administrativas en ese servidor que le permitan verificar que mongod está ejecutando con los parámetros correctos.


He encontrado que esto es más directo que el comando ping:

Mongo mongo = new Mongo(); try { mongo.getConnector().getDBPortPool(mongo.getAddress()).get().ensureOpen(); } catch (Exception e) { ... }


No he probado esto a fondo (solo uso un localhost mongo) pero parece funcionar hasta ahora:

public boolean mongoRunningAt(String uri) { try { Mongo mongo = new Mongo(new MongoURI(uri)); try { Socket socket = mongo.getMongoOptions().socketFactory.createSocket(); socket.connect(mongo.getAddress().getSocketAddress()); socket.close(); } catch (IOException ex) { return false; } mongo.close(); return true; } catch (UnknownHostException e) { return false; } }

Y las pruebas que he usado:

@Test public void whenMongoNotAvailableAtSpecificURLThenTheLoaderKnows() { assertThat(mongoRunningAt("mongodb://127.0.0.1:12345"), is(false)); } @Test public void whenMongoAvailableAtSpecificURLThenTheLoaderKnows() { assertThat(mongoRunningAt("mongodb://127.0.0.1:27017"), is(true)); }

No es exactamente usar una API pública bien definida, así que úsala bajo tu propio riesgo.


Puede ejecutar un comando ping

Mongo mongo = new Mongo(); DBObject ping = new BasicDBObject("ping", "1"); try { mongo.getDB("dbname").command(ping); } catch (MongoException e) { ... }


public boolean keepAlive(Mongo mongo) { return mongo.getAddress() != null; }

Esto devolverá nulo para la dirección si mongo está inactivo. Puede mirar dentro de la implementación de getAddress() para ver por qué es una buena manera de verificar el estado del mongo.

Supongo que ha inicializado correctamente el parámetro mongo .