Nylige versioner af MongoDB java API'et kaster forbindelsesundtagelser ind i en separat dæmonmonitor-tråd, hvorfor du ikke kan fange den - løberen er her i din stack-sporing:com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run
For at overvåge MongoDB-klienten for undtagelser, kan du tilføje en lytter, der giver dig mulighed for at handle på eventuelle undtagelser, der kan forekomme, og kontrollere forbindelsesstatus, når som helst du har brug for det. Du vil stadig ikke kunne fange disse undtagelser, men din ansøgning vil i det mindste blive gjort opmærksom på dem. En ting at bemærke er, at det kan tage noget tid for forbindelsen at blive etableret (eller mislykkes), så hvis du bare er interesseret i at oprette en engangsforbindelse, vil jeg anbefale at implementere en sleep loop, der kontrollerer, om forbindelsen er OK og mislykkede/undtagelsestilstande. Jeg skrev denne løsning ved hjælp af version 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();
}