2016-11-25 4 views
1

mongoインスタンスに接続するためにMongo DB javaドライバを使用しています。以下は、MongoClientインスタンスを作成するために使用しているコードです。MongoClientインスタンスの作成時に例外をキャッチする方法

ホスト名またはポート番号が正しくない場合は、以下の例外が発生します。私はその例外をどのように捕まえることができるのかを迷っています。 MongoDBの接続は、クライアントコードではキャッチできない内部スレッドで起こっています。私はMongoClientが正しく接続されているかどうかを知りたい。どうすればその情報を入手できますか?

INFO: Exception in monitor thread while connecting to server localhost:0 
com.mongodb.MongoSocketOpenException: Exception opening socket 
    at com.mongodb.connection.SocketStream.open(SocketStream.java:63) 
    at com.mongodb.connection.InternalStreamConnection.open(InternalStreamConnection.java:115) 
    at com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:116) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: java.net.ConnectException: Can't assign requested address (connect failed) 
    at java.net.PlainSocketImpl.socketConnect(Native Method) 
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) 
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) 
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) 
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) 
    at java.net.Socket.connect(Socket.java:589) 
    at com.mongodb.connection.SocketStreamHelper.initialize(SocketStreamHelper.java:50) 
    at com.mongodb.connection.SocketStream.open(SocketStream.java:58) 
    ... 3 more 

EDIT1

私のコードでキャッチされていない上に示した例外。それはMongoのコードで捕捉されるかもしれません。したがって、インスタンスが正しく作成されているかどうかはわかりません。

答えて

-3
new MongoClient("localhost", 1111); 

     } catch (MongoSocketOpenException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

キャッチブロックに適切な例外の名前を付ける必要があります。これは例外に適用されます。一意の例外ごとにいくつでもキャッチブロックを追加できます

+0

を私が試してみましたが、私はまだ例外をキャッチしません。あなたが私の投稿に印刷した例外スタックを見れば、スレッドで例外が発生したことを示すjava.lang.Thread.run(Thread.java:745)の行を見ることができます。 –

2

サーバー接続はデーモンスレッド上に作成されます。 Mongo Clientを作成している間、接続に関するエラーをチェックすることはできません。

読み取りまたは書き込みを含む最初の実際のデータベースを作成するときは、接続チェックを遅らせる必要があります。

アイデアを得るためのデモンストレーション用です。

Exception in thread "main" com.mongodb.MongoTimeoutException: Timed out after 30000 ms while waiting for a server that matches ReadPreferenceServerSelector{readPreference=primary}. Client view of cluster state is {type=UNKNOWN, servers=[{address=127.0.34.1:89, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketOpenException: Exception opening socket}, 
caused by {java.net.ConnectException: Connection refused: connect}}] 
at com.mongodb.connection.BaseCluster.createTimeoutException(BaseCluster.java:375) 

メインスレッドからMongoTimeoutException

INFO: Exception in monitor thread while connecting to server 127.0.34.1:89 
com.mongodb.MongoSocketOpenException: Exception opening socket 
at com.mongodb.connection.SocketStream.open(SocketStream.java:63) 
at com.mongodb.connection.InternalStreamConnection.open(InternalStreamConnection.java:115) 
at com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:116) 
at java.lang.Thread.run(Thread.java:745) 
Caused by: java.net.ConnectException: Connection refused: connect 

デーモンスレッドから

MongoClient mongoClient = new MongoClient("127.0.34.1", 89); 
DB db = mongoClient.getDB("test"); 
try { 
    db.addUser("user", new char[] {'p', 'a', 's', 's'}); 
} catch(Exception e) { MongoTimeoutException exception} 

MongoSocketOpenExceptionのでMongoTimeoutExceptionでのtry catchブロックでコードをラップし、それが接続関連のエラーをチェックするために大丈夫動作します。

0

それは非常にシンプルかつエレガントです:あなたMongoClient

ByteArrayOutputStream file=new ByteArrayOutputStream(); 
System.setErr(new PrintStream(file)); 
  • をサーバーに接続し、あなたのMongoCredentials

      ファイルへ
    1. リダイレクトSystem.err

      MongoCredential credenciales=MongoCredential.createCredential("root", "admin", "root".toCharArray()); 
      MongoClient client = new MongoClient(new ServerAddress("localhost"), Arrays.asList(credenciales)); 
      
    2. String texto=new String(file.toByteArray()); 
      
    3. Autentication failed文字列が存在するかどうかを確認します:0 ByteArrayOutputStreamオブジェクトであるエラー出力に、読む

      if (texto.contains("'Authentication failed.'")) 
          // do something; 
      else 
          ... 
      
  • 関連する問題