Последните версии на приложния програмен интерфейс (API) на MongoDB java хвърлят изключения за връзка в рамките на отделна нишка за монитор на демон, поради което не можете да го хванете - програмата за изпълнение е тук във вашето проследяване на стека:com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.runсилен>
За да наблюдавате MongoDB клиента за изключения, можете да добавите слушател, който ще ви позволи да действате при всякакви изключения, които могат да възникнат, и да проверявате състоянието на връзката по всяко време, когато имате нужда. Все още няма да можете да уловите тези изключения, но приложението ви поне ще бъде уведомено за тях. Едно нещо, което трябва да се отбележи, е, че може да отнеме известно време, за да се установи (или да се провали) връзката, така че ако просто се интересувате от създаване на връзка за еднократна употреба, бих препоръчал внедряване на цикъл на заспиване, който проверява дали връзката е ОК и неуспешни/изключителни състояния. Написах това решение, използвайки версия 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();
}