2016-04-22 2 views
3

Я использую веб-приложение весны, которое подключается к mongo db, который работает из коробки. Я просто использую следующие свойства:Set Mongo Timeout весной Boot

spring.data.mongodb.host=myHost 
spring.data.mongodb.port=27017 
spring.data.mongodb.database=myDatabase 
spring.data.mongo.repositories.enabled=true 
spring.data.mongodb.username=myUser 
spring.data.mongodb.password=myPassword 

Тайм-аут по умолчанию для MongoDB составляет 10 секунд. Я хотел бы настроить таймаут. Я пробовал делать spring.data.mongodb.socketTimeout=2 или spring.data.mongodb.connectionTimeout=2

Ни одно из объектов не работает. Это что-то, что я могу указать в свойствах, и Spring Framework позаботится об этом, или может кто-нибудь дать пример этого, объявив Bean.

ответ

2

MongoClientOptions - класс, обладающий требуемыми свойствами.

Программным Если вы настроили MongoDB программно, то ниже приведен фрагмент кода, чтобы помочь вам.

DB mongoDb; 

MongoClient mongoClient = new MongoClient(new ServerAddress(url, port), 
          MongoClientOptions.builder() 
          .socketTimeout(3000) 
          .minHeartbeatFrequency(25) 
          .heartbeatSocketTimeout(3000) 
          .build()); 
mongoDb = mongoClient.getDB(dbname); 

XML конфигурации - Advanced

<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> 

Также см here для полной документации.

1

Вопрос был специально для весеннего ботинка. Я использую следующий подход, который работает хорошо, пожалуйста, предложите, если есть способ не использовать новые и использовать Spring для его настройки.

import java.util.ArrayList; 
import java.util.List; 
import org.springframework.beans.factory.annotation.Value; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.data.mongodb.config.AbstractMongoConfiguration; 
import org.springframework.data.mongodb.core.mapping.MongoMappingContext; 
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories; 
import com.mongodb.Mongo; 
import com.mongodb.MongoClient; 
import com.mongodb.MongoClientOptions; 
import com.mongodb.MongoCredential; 
import com.mongodb.ServerAddress; 

@Configuration 
@EnableMongoRepositories("com.myapp.repository") 
public class SpringMongoConfig extends AbstractMongoConfiguration { 

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

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

@Value("${myapp.mongodb.database}") 
private String mongoDB; 

@Value("${myapp.mongodb.userName}") 
private String userName; 

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

@Value("${myapp.mongodb.socketTimeoutMS}") 
private int socketTimeout; 

@Value("${myapp.mongodb.connectionTimeoutMS}") 
private int connectionTimeout; 

@Override 
public MongoMappingContext mongoMappingContext() throws ClassNotFoundException { 
return super.mongoMappingContext(); 
} 

@Override 
@Bean 
public Mongo mongo() throws Exception { 

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

List<MongoCredential> creds = new ArrayList<MongoCredential>(); 
creds.add(MongoCredential.createCredential(userName, mongoDB, password.toCharArray())); 

MongoClientOptions builder = MongoClientOptions.builder().socketTimeout(socketTimeout).connectTimeout(connectionTimeout).build(); 

return new MongoClient(servers, creds, builder); 
} 

@Override 
protected String getDatabaseName() { 
return mongoDB; 
} 
} 
6

Это перекроет Spring загрузочную автонастройки:

@Configuration 
public class MongoDbSettings { 

    @Bean 
    public MongoClientOptions mongoOptions() { 
     return MongoClientOptions.builder().socketTimeout(2000).build(); 
    } 

} 
+0

Это работает :), спасибо. Но добавление статического класса кажется ненужным. – OlgaMaciaszek

1

Вопрос стар, но и для всех тех, у кого есть проблемы с тайм-ауты драйвера Монго DB JAVA: установить свойство maxConnectionIdleTime.

Пример Spring Ботинки:

import com.mongodb.MongoClient; 
import com.mongodb.MongoClientOptions; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; 
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; 
import org.springframework.boot.autoconfigure.mongo.MongoProperties; 
import org.springframework.boot.context.properties.EnableConfigurationProperties; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.core.env.Environment; 

import javax.annotation.PreDestroy; 
import java.net.UnknownHostException; 

@Configuration 
@ConditionalOnClass(MongoClient.class) 
@EnableConfigurationProperties(MongoProperties.class) 
@ConditionalOnMissingBean(type = "org.springframework.data.mongodb.MongoDbFactory") 
public class MongoAutoConfiguration { 
    @Autowired 
    private MongoProperties properties; 

    @Autowired(required = false) 
    private MongoClientOptions options; 

    @Autowired 
    private Environment environment; 

    private MongoClient mongo; 

    @PreDestroy 
    public void close() { 
     if (this.mongo != null) { 
      this.mongo.close(); 
     } 
    } 

    @Bean 
    @ConditionalOnMissingBean 
    public MongoClient mongo() throws UnknownHostException { 
     this.options = options.builder().maxConnectionIdleTime(1000 * 60 * 4).build(); 
     this.mongo = this.properties.createMongoClient(this.options, this.environment); 
     return this.mongo; 
    } 
} 

Очень полезная ссылка здесь: Java DriverJAVA-2535 com.mongodb.MongoSocketWriteException ......

0

Чтобы следовать вашей теме, это было бы лучше, чтобы ответить на ваш вопрос. Похоже, вы хотите установить тайм-аут в файле application.properties.

Для того, чтобы сделать это:

Вместо

spring.data.mongodb.host=myHost 
spring.data.mongodb.port=27017 
spring.data.mongodb.database=myDatabase 

spring.data.mongodb.username=myUser 
spring.data.mongodb.password=myPassword 

Попробуйте

spring.data.monogdb.uri=mongodb://myUser:[email protected]:27017,myHost:27017/myDatabase?serverSelectionTimeoutMS=2000&connectTimeoutMS=2000 
spring.data.mongodb.database=myDatabase 
spring.data.mongo.repositories.enabled=true 

изменить время в миллисекундах до нужного времени.