3

在我的应用程序中,MongoDB 3.2.4运行在自定义端口上,我想实现逻辑,我的应用程序将尝试在自定义端口上达到MongoDB,如果失败,它将使用默认端口27018如何检查是否用Java建立了MongoDB连接?

为了做到这一点我使用下面的代码:

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…*/ 
} 

的问题是,这个异常没有被捕获。在 com.mongodb.connection.InternalStreamConnection异常开口插座在 com.mongodb.connection.SocketStream.open(SocketStream.java:63): 虽然MongoDB引发以下例外:

com.mongodb.MongoSocketOpenException 。开(InternalStreamConnection.java:114) 在 com.mongodb.connection.DefaultServerMonitor $ ServerMonitorRunnable.run(DefaultServerMonitor.java:128) 在java.lang.Thread.run(Thread.java:745)引起的: java.net.ConnectException:连接被拒绝:连接在 java.net.DualStackPlainSocketImpl.waitForConnect(Native Me的ThOD)在 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 )at java.net.Socket.connect(Socket.java:589)at com.mongodb.connection.SocketStreamHelper.initialize(SocketStreamHelper.java:50) at com.mongodb.connect on.SocketStream.open(SocketStream.java:58) ... 3个

try-catch表达不能赶上这个例外。

我尝试多种方法,如抓:

  • Exception
  • RuntimeException
  • MongoSocketOpenException
  • MongoException
  • MongoCommandException

他们都不工作。

我的问题:

  1. 我如何检查是否建立MongoDB连接?
  2. 怎么能赶上例外MongoSocketOpenException
+0

我同意Frankenapps,那句话不是抛出异常。我认为当你实例化你的客户时,它正在被抛出。赶上那里的例外。 – RubioRic

回答

0
  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()); 
+0

什么类型的'mongo'对象是?在我的例子中,'mongoClient'是一种'MongoClient'。 –

+0

它看起来像我们使用相同的对象,但不同的构造函数。我使用: 'String mongoClientURI =“mongodb://”+ DB_SRV_USR +“:”+ DB_SRV_PWD +“@”+ DB_URL +“:”+ DB_PORT_CUS +“/”+ dbName; MongoClientURI connectionString = new MongoClientURI(mongoClientURI); //启用SSL连接 MongoClientOptions.builder()。sslEnabled(true).build();' –

+0

您是否尝试过使用我的构造函数? – frankenapps