Các phiên bản gần đây của MongoDB java API đưa ra các ngoại lệ kết nối trong một chuỗi giám sát daemon riêng biệt, đó là lý do tại sao bạn không thể bắt được nó- trình chạy ở đây trong dấu vết ngăn xếp của bạn: com.mongodb.connection.DefaultServerMonitor $ ServerMonitorRunnable.run
Để theo dõi ứng dụng khách MongoDB cho các trường hợp ngoại lệ, bạn có thể thêm trình lắng nghe cho phép bạn hành động trên bất kỳ trường hợp ngoại lệ nào có thể xảy ra và kiểm tra trạng thái kết nối bất cứ lúc nào bạn cần. Bạn vẫn sẽ không thể nắm bắt những trường hợp ngoại lệ này, nhưng ứng dụng của bạn ít nhất sẽ được thông báo về chúng. Một điều cần lưu ý là có thể mất một khoảng thời gian để kết nối được thiết lập (hoặc không thành công), vì vậy nếu bạn chỉ quan tâm đến việc tạo kết nối sử dụng một lần, tôi khuyên bạn nên triển khai vòng lặp ngủ để kiểm tra kết nối. và các trạng thái không thành công / ngoại lệ. Tôi đã viết giải pháp này bằng phiên bản 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();
}