Versões recentes da API java do MongoDB lançam exceções de conexão em um thread de monitor de daemon separado, e é por isso que você não pode pegá-lo - o executor está aqui em seu rastreamento de pilha:com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run
Para monitorar o cliente MongoDB em busca de exceções, você pode adicionar um ouvinte que permitirá que você atue em quaisquer exceções que possam ocorrer e verifique o status da conexão sempre que precisar. Você ainda não poderá capturar essas exceções, mas pelo menos seu aplicativo será informado sobre elas. Uma coisa a notar é que pode levar algum tempo para que a conexão seja estabelecida (ou falhe), portanto, se você estiver interessado apenas em criar uma conexão de uso único, recomendo implementar um loop de sono que verifique a conexão OK e estados com falha/exceção. Eu escrevi esta solução usando a versão 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();
}