3

私のアプリでは、MongoDB 3.2.4 がカスタム ポートで実行されます。アプリがカスタム ポートで MongoDB にアクセスしようとし、失敗した場合はデフォルト27018ポートを使用するロジックを実装したいと考えています。

そのために、次のコードを使用します。

String mongoClientURI = "mongodb://" + DB_SRV_USR + ":" + DB_SRV_PWD + "@" + DB_URL + ":" + DB_PORT_CUS + "/" + dbName;
MongoClientURI connectionString = new MongoClientURI(mongoClientURI);

// enable SSL connection
MongoClientOptions.builder().sslEnabled(true).build();

if (this.mongoClient == null) {
    this.mongoClient = new MongoClient(connectionString);
}

// create database if doesn't exist
MongoDatabase mdb = this.mongoClient.getDatabase(dbName);

try {
    this.mongoClient.getAddress();
} catch (com.mongodb.MongoSocketOpenException e) {
    System.out.println("Switch to default port");
    /*…use default port logic…*/
}

問題は、この例外がキャッチされないことです。ただし、MongoDB は次の例外をスローします。

com.mongodb.MongoSocketOpenException: com.mongodb.connection の com.mongodb.connection.SocketStream.open(SocketStream.java:63) でソケットを開いているときに例外が発生しました。 DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:128) at java.lang.Thread.run(Thread.java:745) 原因: java.net.ConnectException: 接続拒否: java.net.DualStackPlainSocketImpl.waitForConnect(Native で接続) Method) で java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85) で java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) で java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) で java. net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) で java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) で java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) で java.net.Socket.connect(Socket.java) :589) com.mongodb.connection.SocketStreamHelper.initialize(SocketStreamHelper.java:50) で com.mongodb.connection.SocketStream.open(SocketStream.java:58) で ... 3 詳細

私のtry-catch式はこの例外をキャッチできません。

キャッチするなど、複数のアプローチを試しました。

  • Exception
  • RuntimeException
  • MongoSocketOpenException
  • MongoException
  • MongoCommandException

それらのどれも機能しません。

私の質問:

  1. MongoDB 接続が確立されているかどうかを確認するにはどうすればよいですか?
  2. どうすれば例外をキャッチできますMongoSocketOpenExceptionか?
4

1 に答える 1

1
  1. このコードを使用して接続を確認します。

    try {
        mongo.getAddress();
    } catch (Exception e) {
        System.out.println("Database unavailable!");
        mongo.close();
        return;
    }
    
  2. ここでは、this.mongoClient.getAddress();その例外をスローしないと思いますが、よくわかりません

編集:次の方法で初期化しました:

Builder builder = MongoClientOptions.builder().connectTimeout(3000);  
MongoClient mongo = new MongoClient(new ServerAddress("192.168.0.1", 3000), builder.build());
于 2016-04-10T09:42:40.373 に答える