Najnowsze wersje interfejsu MongoDB java API zgłaszają wyjątki połączenia w osobnym wątku monitora demona, dlatego nie można go przechwycić — program uruchamiający znajduje się tutaj w śladzie stosu:com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run
Aby monitorować klienta MongoDB pod kątem wyjątków, możesz dodać odbiornik, który pozwoli Ci działać na wyjątkach, które mogą wystąpić, i sprawdzać stan połączenia w dowolnym momencie. Nadal nie będziesz w stanie wychwycić tych wyjątków, ale Twoja aplikacja zostanie przynajmniej o nich poinformowana. Należy zauważyć, że nawiązanie połączenia może zająć trochę czasu (lub zakończyć się niepowodzeniem), więc jeśli jesteś zainteresowany utworzeniem połączenia jednorazowego użytku, polecam zaimplementować pętlę uśpienia, która sprawdza, czy połączenie jest OK oraz stany niepowodzenia/wyjątków. Napisałem to rozwiązanie używając wersji 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();
}