如何在MongoClient for VertX中正确处理异常

时间:2019-03-15 16:51:54

标签: mongodb vert.x mongo-java-driver

在我的应用程序的启动方法中,我想检查提供给应用程序的MongoDB凭据是否正常。如果一切正常,我将继续启动,否则,由于无法连接到数据库,应用程序应退出。代码段如下:

  // Create the client
  MongoClient mongodb = null;
  try {
      mongodb = MongoClient.createShared(vertx, mongo_cnf, mongo_cnf.getString("pool_name"));
  }
  catch(Exception e) {
      log.error("Unable to create MongoDB client. Cause: '{}'. Bailing out", e.getMessage());
      System.exit(-1);
  }

如果我提供了错误的凭据,则不会调用catch块。但是我在控制台上得到了以下内容:

  19:35:43.017 WARN  org.mongodb.driver.connection - Exception thrown during connection pool background maintenance task
com.mongodb.MongoSecurityException: Exception authenticating MongoCredential{mechanism=null, userName='user', source='admin', password=<hidden>, mechanismProperties={}}
    at com.mongodb.connection.SaslAuthenticator.wrapException(SaslAuthenticator.java:162)
    at com.mongodb.connection.SaslAuthenticator.access$200(SaslAuthenticator.java:39)
... many lines

问题是:如何在我的代码中拦截此异常并能够正确处理它?<​​/ p>

2 个答案:

答案 0 :(得分:1)

mongodb的java驱动程序守护程序线程中发生了异常,因此您无法捕获它。

Vertx MongoClient使您从与MongoDB Java驱动程序的直接交互中抽象出来,因此您无法修改与客户端相关的任何内容。

您可以通过反射访问mongo客户端实例,但是由于它已经创建,因此无法将其他配置传递给它。

如果您使用apiVersion: velero.io/v1 kind: VolumeSnapshotLocation metadata: name: azure-default namespace: velero spec: provider: azure config: apiTimeout: "30" ,则可以传递com.mongodb.async.client.MongoClient来访问该异常,然后可以对其进行检查(请参阅此答案以获取更多详细信息-https://stackoverflow.com/a/46526000/1126831)。

但是只能在构建mongo客户端时指定ServerListener,这是在Vertx MongoClient包装器内部进行的,并且无法传递此附加配置。

答案 1 :(得分:1)

当前不会引发异常,我认为这是设计错误,因为您收到了无法使用的对象。随时打开错误:https://github.com/vert-x3/vertx-mongo-client/issues

要检测您的客户“死亡还是到达”,您可以做的是等待20次重试:

MongoClient client = MongoClient.createShared(vertx, config, "pool_name");
client.findOne("some_collection", json1, json2, (h) -> {
    if (h.succeeded()) {
        //...
    }
    else {
        // Notify that the client is dead
    }
});