【问题标题】:Exceptions not being handled correctly with MongoDB Java driver使用 MongoDB Java 驱动程序无法正确处理异常
【发布时间】:2016-06-15 08:15:30
【问题描述】:

我的 MongoDB Java 驱动程序有问题(使用驱动程序版本 3.0.4 和 MongoDB 版本 3.2.3)。我正在尝试检查是否打开了与 MongoDB 服务器的连接,如果没有则抛出异常。我应该能够抓住它:

servName = "Username";
servPW = "Password";

try {
    MongoCredential cred = MongoCredential.createCredential(servName, "DatabaseName", servPW.toCharArray());

    MongoClient mongo = new MongoClient(new ServerAddress("localhost", 27017), Arrays.asList(cred));

} catch (MongoException e){
    System.out.println("ERROR");
}

System.out.println("WE ARE HERE");

我遇到的问题是抛出的异常没有被捕获,它似乎来自我无法访问的线程?对于测试,我没有运行 Mongo 服务器只是为了查看抛出的异常。与此问题 (MongoDB java driver 3.0 can't catch exception when authenticate) 中的问题类似。这是输出:

2016 年 3 月 2 日下午 12:24:17 com.mongodb.diagnostics.logging.JULLogger 日志 信息:使用设置 {hosts=[localhost:27017]、mode=SINGLE、requiredClusterType=UNKNOWN 创建的集群, serverSelectionTimeout='30000 毫秒',maxWaitQueueSize=500} 我们在这儿 2016 年 3 月 2 日 12:24:18 PM com.mongodb.diagnostics.logging.JULLogger 日志 信息:连接到服务器 localhost:27017 时,监视器线程中出现异常 com.mongodb.MongoSocketOpenException:在 com.mongodb.connection.SocketStream.open(SocketStream.java:63) 处打开套接字的异常 com.mongodb.connection.InternalStreamConnection.open(InternalStreamConnection.java:114) 在 com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:127) 在 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 更多

我试图捕捉“com.mongodb.MongoSocketOpenException”、“Exception”和其他一些,但似乎没有任何效果!有人能帮我解决我哪里出错了吗?

【问题讨论】:

  • at java.lang.Thread.run(Thread.java:745) -- 看起来您的异常正在另一个线程中引发。你必须在那里catch它。
  • 在 WE ARE HERE 打印后出现,因此您发布的 try/catch 显然不是它发生的地方。
  • 是的,这就是我的想法,虽然运行的线程来自 MongoDB 驱动程序库。关于如何访问线程并捕获它的任何想法?无论如何感谢您的帮助。

标签: java mongodb authentication exception driver


【解决方案1】:

据我所知,迁移到 Mongo 3 驱动程序改变了创建 Mongo 客户端的行为——它变成了一个非阻塞操作,当你尝试使用它时你才知道你是否真的有一个工作连接。

我观看的有关此的视频 (https://www.mongodb.com/presentations/mongodb-drivers-and-high-availability-deep-dive) 建议在创建客户端后立即使用它来检查它是否成功 - 它建议使用询问连接的服务器是否是“主服务器”的命令(不是确定这是在 Java 中的什么)。

【讨论】:

    【解决方案2】:

    我无法找到这个问题的答案,也无法自己解决。为了解决这个问题,我降级到驱动程序版本 2.11.1 并使用它!

    【讨论】:

      猜你喜欢
      • 2021-11-08
      • 1970-01-01
      • 2016-08-21
      • 2016-03-13
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多