mongodb - 如何在 MongoClient for VertX 中正确处理异常
问题描述
在我的应用程序的启动方法中,我想检查提供给应用程序的 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
问题是:如何在我的代码中拦截这个异常并能够正确处理它?
解决方案
该异常发生在 mongodb 的 java 驱动程序守护线程中,因此您无法捕获它。
Vertx MongoClient 将您从与 MongoDB Java 驱动程序的直接交互中抽象出来,因此您无法修改与客户端相关的任何内容。
您可以通过反射访问 mongo 客户端实例,但由于它已经创建,您无法向其传递额外的配置。
如果您使用过,com.mongodb.async.client.MongoClient
您可以通过ServerListener
which 可以访问异常并且您可以检查它(有关更多详细信息,请参阅此答案 - https://stackoverflow.com/a/46526000/1126831)。
但是只能ServerListener
在构建 mongo 客户端时指定,这发生在 Vertx MongoClient 包装器内部,并且无法传递此附加配置。
推荐阅读
- python - 删除文本中的标记链接
- python - 使用 python-can 模拟 CAN / OBD2 车辆
- javascript - 错误:不匹配的右括号,我确定没有
- python - 使用fuzzywuzzy 进行字符串匹配——是使用Levenshtein 距离还是Ratcliff/Obershelp 模式匹配算法?
- c - 将 printf 重定向到 fopencookie
- r - 用“at”指定时如何绘制预测边距?
- c++ - 如何从 OSX 上的 readdir 获取正确的文件名?
- postgresql - 带有 IAM 身份验证错误的 Aurora RDS Postgres?
- c# - OIDC 登录失败并显示“相关失败” - 存在 cookie 时“找不到 cookie”
- game-physics - aframe 物理 gltf 模型模型没有被解析