Le versioni recenti dell'API java di MongoDB generano eccezioni di connessione all'interno di un thread di monitoraggio del demone separato, motivo per cui non è possibile rilevarlo:il corridore è qui nella traccia dello stack:com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run
Per monitorare le eccezioni del client MongoDB, puoi aggiungere un listener che ti consentirà di agire su eventuali eccezioni che potrebbero verificarsi e di controllare lo stato della connessione ogni volta che ne hai bisogno. Non sarai ancora in grado di catturare queste eccezioni, ma la tua applicazione ne sarà almeno informata. Una cosa da notare è che può volerci del tempo prima che la connessione venga stabilita (o fallita), quindi se sei solo interessato a creare una connessione monouso, ti consiglio di implementare un ciclo di sonno che controlli la connessione OK e stati di errore/eccezione. Ho scritto questa soluzione utilizzando la versione 3.3 (https://api.mongodb.com/java/3.3/ ):
public class MongoStatusListener implements ServerListener {
private boolean available = false;
public boolean isAvailable() {
return available;
}
@Override
public void serverOpening(ServerOpeningEvent event) {}
@Override
public void serverClosed(ServerClosedEvent event) {}
@Override
public void serverDescriptionChanged(ServerDescriptionChangedEvent event) {
if (event.getNewDescription().isOk()) {
available = true;
} else if (event.getNewDescription().getException() != null) {
//System.out.println("exception: " + event.getNewDescription().getException().getMessage());
available = false;
}
}
}
public MongoClient getMongoClient(String login, String password) {
if (mongoClient != null) {
return mongoClient;
}
MongoClientOptions.Builder optionsBuilder = new MongoClientOptions.Builder();
MongoStatusListener mongoStatusListener = new MongoStatusListener();
optionsBuilder.addServerListener(mongoStatusListener);
this.mongoClient = new MongoClient(asList(new ServerAddress("localhost"), new ServerAddress("localhost:27017")),
singletonList(MongoCredential.createCredential(
login,
"cookbook",
password.toCharArray())
), optionsBuilder.build());
this.mongoDatabase = mongoClient.getDatabase("cookbook");
return mongoClient;
}
public boolean isAvailable() {
return mongoStatusListener.isAvailable();
}