在我的应用程序的启动方法中,我想检查提供给应用程序的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>
答案 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
}
});