MongoClientコンストラクターは、接続関連の例外をスローしません。むしろ、接続を確立し、提供された資格情報に基づいて認証を試みる1つ以上のバックグラウンドスレッドを開始した直後に戻ります。
例外がスローされるのは、アプリケーションがMongoClientを使用してMongoDBサーバーで何らかの操作を実行する場合のみです。ただし、その例外は一般的なタイムアウト例外であり、サーバー選択タイムアウトが期限切れになる前に、ドライバーが操作に適したサーバーを見つけられなかったことを示します。例:
MongoClient client = new MongoClient(asList(new ServerAddress("localhost"), new ServerAddress("localhost:27018")),
singletonList(MongoCredential.createCredential("username",
"admin",
"bad".toCharArray())),
MongoClientOptions.builder().serverSelectionTimeout(1000).build());
try {
client.getDB("admin").command("ping");
} catch (MongoTimeoutException e) {
// do something
}
1秒後にMongoTimeoutExceptionをスローします。 MongoSecurityExceptionはスローされませんが、MongoTimeoutExceptionのメッセージには関連する詳細が含まれます。たとえば、サーバーの1つがダウンし、残りの2つで認証が失敗したときに、3つのメンバーのレプリカセットに接続すると、MongoTimeoutExceptionのメッセージフィールドは次のようになります。
ReadPreferenceServerSelector {readPreference=primary}に一致するサーバーを待機中に1000ミリ秒後にタイムアウトになりました。クラスタ状態のクライアントビューは{type=UNKNOWN、servers =[{address =localhost:27017、type =UNKNOWN、state =CONNECTING、exception ={com.mongodb.MongoSocketOpenException:Exceptionopeningsocket}です。これは{java.net.ConnectException:接続が拒否されました}}、{address =localhost:27018、type =UNKNOWN、state =CONNECTING、exception ={com.mongodb.MongoSecurityException:Exceptionauthenticating MongoCredential {mechanism =null、userName ='username'、source ='admin'、password =、mechanismProperties ={}}}、{com.mongodb.MongoCommandException:コマンドがエラー18で失敗しました:「認証に失敗しました。」サーバーlocalhost:27018。完全な応答は{"ok":0.0、 "code":18、 "errmsg":"認証に失敗しました。" }}}]