【发布时间】:2020-10-03 01:09:27
【问题描述】:
问题: 1. 我没有使用 Spring Boot MongoAutoConfiguration 因为我们需要 mongo 是可选的。 2. 同一命名空间中的其他应用程序可以访问 MongoDB,应用程序命名空间和数据库命名空间的网络命名空间相同。 3.当我尝试连接时,我得到超时异常。 4. 我的本地也一样
点已经验证: 1.检查mongod是否启动并运行。同一名称空间中的其他应用程序能够访问相同的应用程序,但它使用 Spring Mongo 实现。 2.没有网络问题。 3. stackoverflow 中有相同异常的帖子,它已经过测试。不工作。
a) application.properties:
mongo.hosts = mongo-node-1.database, mongo-node-2.database, mongo-node-3.database
mongo.port = 27017
mongo.database = database
isMongoEnabled = true
b) MongoClient bean:
@Configuration
public class MongoConfiguration {
@Value("#{'${mongo.hosts}'.split(',')}")
private List<String> hosts;
@Value("${mongo.port}")
private int port;
@Value("${isMongoEnabled}")
private boolean isMongoEnabled;
@Value("${mongo.database}")
private String database;
private Mongo createMongo() throws Exception {
final List<ServerAddress> serverList = new ArrayList<>();
for (final String host : hosts) {
serverList.add(new ServerAddress(host, port));
}
return new MongoClient(serverList);
}
@Bean
public Mongo mongoClient() throws Exception {
final Mongo mongo = createMongo();
return mongo;
}
}
c) 模板 bean:
@Configuration
@EnableMongoRepositories(
basePackages = "com.abc.test",
mongoTemplateRef = "customMongoNodeTemplate"
)
@Import(MongoConfiguration.class)
public class TemplateConfiguration {
@Value("${mongo.database}")
private String database;
@Bean
public MongoTemplate customMongoNodeTemplate(@Qualifier ("mongoClient") Mongo mongo) {
final MongoDbFactory factory = new SimpleMongoDbFactory( (MongoClient) mongo, database);
return new MongoTemplate(factory);
}
}
d) 例外:
com.mongodb.MongoTimeoutException: Timed out after 30000 ms while waiting to connect. Client view of cluster state is {type=UNKNOWN, servers=[{address=127.0.0.1:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketOpenException: Exception opening socket}, caused by {java.net.ConnectException: Connection refused (Connection refused)}}]
更新: 尝试 SimpleMongoClientDBFactory(uri) 后出现以下异常:
- Application.properties:
mongo.uri= mongodb://mongo-node-1.database:27017,mongo-node-2.database:27017,mongo-node-3.database:27017/database
例外:
#com.mongodb.MongoTimeoutException: Timed out after 30000 ms while waiting to connect. Client view of cluster state is {type=UNKNOWN, servers=[{address=127.0.0.1:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketOpenException: Exception opening socket}, caused by {java.net.ConnectException: Connection refused (Connection refused)}}]
SPRING 启动版本:
2.1.6
Mongo 版本:
4.0.6
Mongo 驱动版本:
3.8.2
【问题讨论】:
-
你为什么要连接到
127.0.0.1? mongodb 是否与您的应用程序在同一个 pod 中运行? -
确保
public Mongo mongoClient() throws Exception被调用 -
@Valijon :我检查并粘贴了日志并在启动时运行打印,但是当调用查询时,它会尝试并超时并出现相同的异常
-
@michalk:我使用日志验证并看到正确的 URL 加载到 serverAddress 列表中,但是当我得到异常时,它总是 127.0.0.1。我觉得这可能是因为在 nslookup 上我得到了集群 ip 本身。也许这就是为什么。另外我忘了显示 URI 属性将添加它
-
我已经验证了网络配置也没有问题
标签: java mongodb spring-boot openshift spring-data-mongodb