【问题标题】:Spring boot: Handling mongodb timeoutExceptionSpring Boot:处理 mongodb timeoutException
【发布时间】:2017-05-16 08:09:44
【问题描述】:

当mongodb宕机时,spring boot应用宕机。我希望在不停止应用程序的情况下处理连接超时异常并记录错误。 当由于无法连接而从数据库中查找项目失败时,应用程序应该进行另一种处理,例如调用 Web 服务来查找数据。 您对此有任何想法吗?

配置

spring.data.mongodb.uri=mongodb://${MONGODB_DB_HOST}:${MONGODB_DB_PORT}/${MONGODB_DB_DATABASE}?connectTimeoutMS=${mongodb.connection.timeout}

【问题讨论】:

  • Springboot 在设计上是失败的。所以这取决于几件事1.您希望在启动期间或以后何时执行此操作2.您的mongoconfiguration如何,是SpringBoot AutoConfiguration之一还是您手动配置。
  • 我的配置是通过spring boot自动配置的。当从数据库中搜索失败时,我希望调用 Web 服务。我用配置更新了我的问题
  • 所以我希望在启动后处理异常
  • 如果您使用的是 AutoConfiguration,那么即使无法连接到 mongo,springboot 也会启动(尽管它会打印堆栈跟踪)。那么为什么您不能在您尝试的代码中添加一个 try catch找到一个项目?或者为抛出的异常创建一个方面并执行必要的操作

标签: mongodb spring-boot spring-data-mongodb


【解决方案1】:

我使用下面的代码在 Spring Boot 中配置 mongodb 连接

您可以根据需要指定socket超时和连接超时。

@Configuration
public class DatabaseConfiguration {

    private static final Logger LOGGER = LoggerFactory.getLogger(DatabaseConfiguration.class);


    @Value("${spring.data.mongodb.uri}")
    private String mongoUri;

    @Value("${spring.data.mongodb.database}")
    private String mongoDbName;

    @Value("${spring.data.mongodb.host}")
    private String host;

    @Value("${spring.data.mongodb.port}")
    private int port;

    @Value("${spring.data.mongodb.username}")
    private String username;

    @Value("${spring.data.mongodb.password}")
    private String password;

    @Bean
    public MongoTemplate mongoTemplate() {

        LOGGER.debug(" instantiating MongoDbFactory ");

        SimpleMongoDbFactory mongoDbFactory = new SimpleMongoDbFactory(mongoClient(), mongoDbName);

        MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory);

        return mongoTemplate;

    }

    @Bean
    public MongoClient mongoClient() {

        List<ServerAddress> servers = new ArrayList<ServerAddress>();
        servers.add(new ServerAddress(host, port));

        MongoClientOptions mongoClientOptions = MongoClientOptions.builder()
                .connectionsPerHost(10)
                .socketTimeout(2000)
                .connectTimeout(2000)
                .build();

        if (Utils.isNotEmpty(username) && Utils.isNotEmpty(password)) {
            List<MongoCredential> creds = new ArrayList<MongoCredential>();
            creds.add(MongoCredential.createCredential(username, mongoDbName, password.toCharArray()));
            return new MongoClient(servers,creds, mongoClientOptions);
        } else
            return new MongoClient(servers, mongoClientOptions);
    }

    @Bean
    public MongoClientURI mongoClientURI() {
        LOGGER.debug(" creating connection with mongodb with uri [{}] ", mongoUri);
        return new MongoClientURI(mongoUri);
    }

}

在您的 application.yml 文件中定义以下属性

mongodb 特定属性

spring:
  data:
    mongodb:
      database: dbname
      host: localhost
      port: 27017
      username: dbusername
      password: dbpassword

【讨论】:

    【解决方案2】:

    您可以使用以下示例配置 mongodb 超时。我希望很容易转换为springboot的bean annonation。否则你可以导入资源 bean (@ImportResource)

    <beans>
    
      <mongo:mongo host="localhost" port="27017">
        <mongo:options connections-per-host="8"
                       threads-allowed-to-block-for-connection-multiplier="4"
                       connect-timeout="1000"
                       max-wait-time="1500}"
                       auto-connect-retry="true"
                       socket-keep-alive="true"
                       socket-timeout="1500"
                       slave-ok="true"
                       write-number="1"
                       write-timeout="0"
                       write-fsync="true"/>
      </mongo:mongo/>
    
    </beans>
    

    【讨论】:

    • 它如何回答处理异常的问题。此配置只是在 mongo 连接上设置超时。这可以通过属性文件本身来完成。
    • 对不起,这不能回答我的问题。我希望处理 MongoTimeoutException 。
    猜你喜欢
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2022-06-17
    • 2017-06-13
    • 2015-02-23
    相关资源
    最近更新 更多