MongoDB java APIの最近のバージョンは、別のデーモンモニタースレッド内で接続例外をスローします。そのため、それをキャッチできません。ランナーはスタックトレースにあります: com.mongodb.connection.DefaultServerMonitor $ ServerMonitorRunnable.run
MongoDBクライアントの例外を監視するために、発生する可能性のある例外に対処し、必要なときにいつでも接続ステータスを確認できるリスナーを追加できます。それでもこれらの例外をキャッチすることはできませんが、アプリケーションは少なくともそれらを認識します。注意すべき点の1つは、接続が確立される(または失敗する)までに時間がかかる可能性があるため、1回限りの接続を作成することに関心がある場合は、接続がOKかどうかをチェックするスリープループを実装することをお勧めします。失敗/例外状態。このソリューションは、バージョン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();
}