【问题标题】:MongoTimeoutException when trying to insert using Spring boot application app on openshift尝试在 openshift 上使用 Spring Boot 应用程序插入时出现 MongoTimeoutException
【发布时间】: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


【解决方案1】:

Spring-boot:2.3.0.RELEASE

  1. 禁用@SpringBootApplication(exclude = MongoAutoConfiguration.class)

  2. 要启动MongoTemplate,我们可以这样做:

    • MongoDatabaseFactory
    • com.mongodb.client.MongoClient [interface](不要与com.mongodb.MongoClient [class]混淆)

MongoDatabaseFactory实现

application.properties:

mongo.uri=mongodb://mongo-node-1.database:27017,mongo-node-2.database:27017,mongo-node-3.database:27017/database
isMongoEnabled=true

模板 bean

@Configuration
@EnableMongoRepositories(basePackages = "com.abc.test", mongoTemplateRef = "customMongoNodeTemplate")
public class TemplateConfiguration {
    @Value("${mongo.uri}")
    private String uri;

    @Bean
    public MongoTemplate customMongoNodeTemplate() {
        return new MongoTemplate(new SimpleMongoClientDatabaseFactory(uri));
    }
}

【讨论】:

  • 您好,首先非常感谢您的代码推荐。我得到了 url 格式的异常不是预期的错误。更新带有该异常的问题
【解决方案2】:

所以这是我的问题,原来有人最近在 git 中提交了一个 mongoClient,当我使用 pull 时,那是一个新的 MongoClient() 并且在本地转到 localhost 但在集群上失败了。代码从一开始就很好。非常感谢你和我在一起

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-08
    • 2020-12-10
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    • 2020-12-03
    • 2021-01-03
    • 2018-08-31
    相关资源
    最近更新 更多