Nejnovější verze MongoDB java API vyvolávají výjimky připojení v rámci samostatného vlákna monitoru démona, což je důvod, proč to nemůžete zachytit - běžec je zde ve vašem trasování zásobníku:com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run
Chcete-li monitorovat výjimky v klientovi MongoDB, můžete přidat posluchač, který vám umožní reagovat na jakékoli výjimky, které se mohou vyskytnout, a zkontrolovat stav připojení, kdykoli budete potřebovat. Tyto výjimky stále nezachytíte, ale vaše aplikace o nich bude alespoň informována. Jedna věc, kterou je třeba poznamenat, může nějakou dobu trvat, než se připojení vytvoří (nebo selže), takže pokud máte zájem o vytvoření jednorázového připojení, doporučuji implementovat spánkovou smyčku, která zkontroluje, zda je připojení v pořádku. a neúspěšné/výjimečné stavy. Toto řešení jsem napsal pomocí verze 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();
}