2016-01-02 19 views
10

JDBCの土地などで異常なイベントに反応する目的で、javaドライバからmongoサーバが利用できるかどうかを検出できるようにしたいのですが、サーバが稼働していてもうまく動作しますが、苦労しています。なぜエラーを検出するのが難しいのかを理解する。 mongoクライアントが別のスレッドで実行され、それが私に何かを投げかけないので、私はその気持ちを持っていますか?java mongodb driverどのように例外をキャッチしますか?

try { 
     MongoClient mongoClient = new MongoClient("localhost", 27017); 
     MongoDatabase db = mongoClient.getDatabase("mydb"); 
     // if db is down or error getting people collection handle it in catch block 
     MongoCollection<Document> people = commentarr.getCollection("people"); 
    } catch (Exception e) { 
     // handle server down or failed query here. 
    } 

結果は私がキャッチしようとしたが、私のcatchブロックは、まだ何もしなかったいくつかの異なる例外を含有する得られたスタックトレースを

INFO: Exception in monitor thread while connecting to server localhost:27017 

です。

com.mongodb.MongoSocketOpenException: Exception opening socket 
Caused by: java.net.ConnectException: Connection refused 

私は、JavaのMongoDBドライバ3.0.4を使用しています、私は読んでほとんどの記事は「doesnのエラーならば、これは廃止とMongoClient.listDatabaseNames()に置き換えることを除いて、MongoExceptionをスローMongoClient.getDatabaseNames()のようなハックと古いAPIからですセマンティクスを投げているのと同じエラーがあります。

try catchブロックのjavaドライバからmongoクエリを実行するだけの方法がありますが、実際にはcatchされた例外がありますか?新しいAPIでは

+1

@Alexander Kondaurovこの回答を見ることができますか? http://stackoverflow.com/questions/40813060/how-to-catch-exception-when-creating-mongoclient-instance/40814641#40814641特定のものを探しているなら、投稿に追加してください。 – Veeram

答えて

0

MongoExceptionあなたは一般的なMongoExceptionをキャッチするか、または、私は信じて、listDatabaseNames()が最終的にMongoCommandExceptionを投げ終わるでしょうRuntimeException.です。

+0

ありがとう、私は記載された例外を試しましたが、残念ながら例外はまだ捕まえられていません。 –

+0

'MongoSocketOpenException'をキャッチしようとしましたか?それはあなたが積極的に見ているものです。多分、mongoが実際に動いていない(またはそのポートで)ためです。 – evanchooly

+1

ええ、私はその1つと約10人を試しましたが、いずれもキャッチブロックに捕らわれていません。これまでのところ、サーバがダウンしていることを検出するためには、 'MongoClientOptions.builder()。serverSelectionTime()'で設定した数ミリ秒でスローされる 'MongoTimeoutException'が唯一の例外です。私は当分これと一緒に行くつもりです。 –

0

System.errByteArrayOutputStreamバッファにリダイレクトできます。実行時例外がスローされた場合、バッファに収集されます。 次のような類似の問題に対する回答をご覧ください。https://stackoverflow.com/a/47699292/7388679

関連する問題