Versi terbaru dari MongoDB java API melemparkan pengecualian koneksi di dalam utas monitor daemon terpisah, itulah sebabnya Anda tidak dapat menangkapnya- runner ada di sini di jejak tumpukan Anda:com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run
Untuk memantau pengecualian klien MongoDB, Anda dapat menambahkan pendengar yang memungkinkan Anda untuk bertindak atas pengecualian apa pun yang mungkin terjadi dan memeriksa status koneksi kapan pun Anda butuhkan. Anda masih tidak akan dapat menangkap pengecualian ini, tetapi aplikasi Anda setidaknya akan mengetahuinya. Satu hal yang perlu diperhatikan adalah perlu beberapa waktu untuk membuat koneksi (atau gagal), jadi jika Anda hanya tertarik untuk membuat koneksi sekali pakai, saya sarankan menerapkan loop tidur yang memeriksa koneksi OK dan status gagal/pengecualian. Saya menulis solusi ini menggunakan versi 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();
}