如何在禁用MongoDB的情况下运行Spring,但仍要安装它?

时间:2018-07-12 18:29:08

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

我正在阅读这个Git问题: https://github.com/spring-projects/spring-boot/issues/7589 关于Java Spring引导的问题,并正在尝试找出一种在启动时绕过崩溃的方法。

简短的版本是,如果您包含用于创建mongo客户端的代码:

@Bean
public MongoOperations mongoOperations() {
    try {
        //This runs an operation which uses my credentials to login to the db
        return new MongoTemplate(mongoDbFactory());
    } catch (Exception e){
        e.printStackTrace();
        return null;
    }
}

并且MongoDB正在运行,它将连接并且没有任何问题,但是,如果MongoDB没有运行 ,Spring将重试,并且在再次失败后将崩溃并停止所有启动序列。

我的问题是:除了注释掉引用它的所有代码之外,是否有办法绕过此初始崩溃/检查数据库是否已启动并正在运行?我可以在低级别的某个地方捕获异常并让其通过吗?

2 个答案:

答案 0 :(得分:2)

如果您的应用程序表现为MongoDB是可选的,则您有几种选择。

如果要迁移现有应用程序,那么最简单的方法就是从一开始就exclude the auto-configuration并自己创建基础结构。并非以您指示的从null方法返回@Bean的方式来,这是很讨厌的。相反,您可以拥有一些可以延迟创建客户端的服务,并且可以更新MongoDB的可选用法以通过该服务。无论如何都将创建该服务,但仅在必要时创建基础基础结构。

另一个选择是使用配置文件。如果主要用例是MongoDB可用,则创建一个application-nomongo.properties(类似的东西),您将使用spring.autoconfigure.exclude属性排除自动配置。当应用程序在没有mongo的情况下启动时,您可以启用nomongo配置文件,并且自动配置将退出。如果未启用,则Mongo bean将由Spring Boot创建。

答案 1 :(得分:1)

我有同样的问题。我希望我的应用程序也能够脱机运行,将内容排队并不时刷新到数据库。这意味着它需要能够脱机启动并在有互联网时连接。 Ofc,当未成功连接时,Spring崩溃了我的应用程序。 对我有用的是:

@Configuration
@EnableJpaRepositories(bootstrapMode = BootstrapMode.LAZY)
public class DataSourceConfig {

@Bean(destroyMethod = "close")
public DataSource dataSource() {
    HikariConfig hikariConfig = new HikariConfig();
    hikariConfig.setDriverClassName("xxx");
    hikariConfig.setJdbcUrl("xxx");
    hikariConfig.setUsername("xxx");
    hikariConfig.setPassword("xxx");

    hikariConfig.setConnectionTestQuery("SELECT 1");
    hikariConfig.setPoolName("springHikariCP");
    hikariConfig.setInitializationFailTimeout(-1);

    hikariConfig.addDataSourceProperty("dataSource.cachePrepStmts", "true");
    hikariConfig.addDataSourceProperty("dataSource.prepStmtCacheSize", "250");
    hikariConfig.addDataSourceProperty("dataSource.prepStmtCacheSqlLimit", "2048");
    hikariConfig.addDataSourceProperty("dataSource.useServerPrepStmts", "true");
    HikariDataSource dataSource = new HikariDataSource(hikariConfig);

    return dataSource;
}

@Bean
public EntityManager entityManager() {
    return entityManagerFactory().getObject().createEntityManager();
}

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
    LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
    em.setDataSource(dataSource());
    em.setPackagesToScan("blabla");
    em.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
    em.setJpaProperties(additionalProperties());
    return em;
}

private Properties additionalProperties() {
    Properties properties = new Properties();
    properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL55Dialect");

    return properties;
}
}

还将它放在您的App类中

@SpringBootApplication(exclude = HibernateJpaAutoConfiguration.class)

application.yml看起来像这样:

#Spring properties
spring:
  jpa:
    hibernate:
      ddl-auto: update
  datasource:
    url: "xxx"
    username: xxx
    password: xxx
    driver-class-name: com.mysql.cj.jdbc.Driver
    continue-on-error: true
  hikari:
    connection-timeout: 2000
    initialization-fail-timeout: -1
    auto-commit: true

这对我有用,希望它也对你们也有用,我在这里看到很多帖子在寻找解决方案。祝你好运!