2016-04-22 7 views
3

Ich benutze Spring Boot Web-Anwendung, die an Mongo db, die funktioniert aus der Box funktioniert. Ich verwende nur die folgenden Eigenschaften:Set Mongo Timeout im Frühjahr 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 

Das Standard-Timeout zu MongoDB ist 10 Sekunden. Ich möchte das Timeout konfigurieren. Ich habe versucht, spring.data.mongodb.socketTimeout=2 oder spring.data.mongodb.connectionTimeout=2

Keine der Eigenschaften funktionieren. Ist es etwas, was ich in den Eigenschaften spezifizieren kann und das Spring-Framework wird sich darum kümmern oder kann jemand ein Beispiel dafür geben, indem er die Bean deklariert.

Antwort

2

MongoClientOptions ist eine Klasse, die die erforderlichen Eigenschaften hat.

Programmatisch Wenn Sie Ihre MongoDB programmgesteuert konfiguriert haben, dann ist unten das Code-Snippet, um Ihnen zu helfen.

DB mongoDb; 

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

XML-Konfiguration - Erweiterte

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

Auch here für eine vollständige Dokumentation.

1

Die Frage war speziell für Spring Boot. Ich verwende den folgenden Ansatz, der gut funktioniert, bitte schlagen Sie vor, wenn es eine Möglichkeit gibt, nicht neu zu verwenden, und verwenden Sie Spring, um es zu konfigurieren.

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

Dies wird den Frühling Boot-Autokonfiguration außer Kraft setzen:

@Configuration 
public class MongoDbSettings { 

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

} 
+0

Das funktioniert :), danke. Das Hinzufügen der statischen Klasse scheint jedoch unnötig zu sein. – OlgaMaciaszek

1

Die Frage ist alt, aber für alle, die Probleme mit Mongo DB Java-Treiber-Timeouts haben: die maxConnectionIdleTime Eigenschaft festgelegt.

Beispiel Frühling Boot:

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

Ein sehr nützlicher Link hier: Java DriverJAVA-2535 com.mongodb.MongoSocketWriteException ......

0

Ihrem Thema zu folgen, dies wäre die best Ihre Frage zu beantworten. Es sieht so aus, als ob Sie in der Datei application.properties eine Zeitüberschreitung festlegen möchten.

Um dies zu tun:

Statt

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 

Versuchen Sie, diese

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 

Zeit in Millisekunden, um die gewünschte Zeit ändern.

Verwandte Themen