2016-01-02 13 views
10

Voglio essere in grado di rilevare se un server mongo è disponibile dal driver java allo scopo di reagire a eventi anomali come si farebbe in JDBC land ecc. Funziona tutto bene quando il server è attivo ma sto cercando di capire perché è così difficile rilevare gli errori. Ho una sensazione perché il client mongo viene eseguito in un thread diverso e non viene visualizzato da me o qualcosa del genere?driver java mongodb come si rilevano le eccezioni?

try { 
     MongoClient mongoClient = new MongoClient("localhost", 27017); 
     MongoDatabase db = mongoClient.getDatabase("mydb"); 
     // if db is down or error getting people collection handle it in catch block 
     MongoCollection<Document> people = commentarr.getCollection("people"); 
    } catch (Exception e) { 
     // handle server down or failed query here. 
    } 

Il risultato è

INFO: Exception in monitor thread while connecting to server localhost:27017 

Con l'analisi dello stack risultante contenente alcune eccezioni diverse, che ho cercato di catturare, ma i miei blocchi catch ancora non ha fatto nulla.

com.mongodb.MongoSocketOpenException: Exception opening socket 
Caused by: java.net.ConnectException: Connection refused 

Sto usando il driver java MongoDB 3.0.4, la maggior parte dei messaggi che ho letto sono da un'API più anziani con hack come MongoClient.getDatabaseNames() che getta una MongoException se gli errori, ma questa è deprecato ora e sostituito con MongoClient.listDatabaseNames() che doesn' Ho lo stesso errore a lanciare semantica.

C'è un modo per eseguire una query mongo dal driver java in un blocco catch try e in realtà viene rilevata l'eccezione?

+1

@Alexander Kondaurov Puoi dare un'occhiata a questa risposta? http://stackoverflow.com/questions/40813060/how-to-catch-exception-when-creating-mongoclient-instance/40814641#40814641. Se stai cercando qualcosa di specifico, per favore aggiungi al post. – Veeram

risposta

0

Nella nuova API, MongoException è un RuntimeException. è possibile prendere il generico MongoException o, credo, listDatabaseNames() finirebbe per gettare un MongoCommandException definitiva.

+0

Grazie, ho provato le eccezioni elencate ma sfortunatamente le eccezioni non vengono catturate ancora. –

+0

hai provato a catturare 'MongoSocketOpenException'? Questo è quello che stai vedendo attivamente. Probabilmente perché mongo non è in realtà in esecuzione (o su quella porta). – evanchooly

+1

Sì, ho provato uno e circa altri 10 ma nessuno di loro è rimasto intrappolato nei blocchi. Finora per rilevare quando il server è inattivo, l'unica eccezione che posso rilevare è la "MongoTimeoutException" che viene lanciata, nonostante molti ms impostati tramite "MongoClientOptions.builder(). ServerSelectionTime()'. Per ora sto solo andando con questo. –

0

È possibile reindirizzare System.err a un buffer ByteArrayOutputStream. Se viene lanciata un'eccezione di runtime, verrà raccolta nel buffer. Vedere una risposta ad un problema simile a: https://stackoverflow.com/a/47699292/7388679

Problemi correlati