/**
*
*/
import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.data.mongodb.core.SimpleMongoDbFactory;
import java.util.ArrayList;
import java.util.List;
@Configuration
public class MongoConfig {
@Value("${mongodb.custom.database}")
private String database;
@Value("${mongodb.custom.hosts}")
private List<String> hosts;
@Value("${mongodb.custom.hostsandports}")
private String hostsAndPorts;
@Value("${mongodb.custom.ports}")
private List<Integer> ports;
// @Value("${mongodb.custom.replicaSet}")
private String replicaSet;
@Value("${mongodb.custom.username}")
private String username;
@Value("${mongodb.custom.password}")
private String password;
// @Value("${mongodb.custom.authenticationDatabase}")
private String authenticationDatabase;
@Value("${mongodb.custom.minConnectionsPerHost}")
private Integer minConnectionsPerHost;
@Value("${mongodb.custom.connectionsPerHost}")
private Integer connectionsPerHost;
/**链接超时设定*/
@Value("${mongodb.custom.connectTimeout}")
private Integer connectTimeout;
/**套接字超时时间设定*/
@Value("${mongodb.custom.socketTimeout}")
private Integer socketTimeout;
// 覆盖默认的MongoDbFactory
@Bean
MongoDbFactory mongoDbFactory() {
//客户端配置(连接数、副本集群验证)
MongoClientOptions.Builder builder = new MongoClientOptions.Builder();
//设置链接超时时间
builder.connectTimeout(connectTimeout);
//套接字超时设定
builder.socketTimeout(socketTimeout);
builder.connectionsPerHost(connectionsPerHost);
builder.minConnectionsPerHost(minConnectionsPerHost);
if (replicaSet != null && !replicaSet.equals("")) {
builder.requiredReplicaSetName(replicaSet);
}
MongoClientOptions mongoClientOptions = builder.build();
// MongoDB地址列表
List<ServerAddress> serverAddresses = new ArrayList<>();
if(hostsAndPorts != null && hostsAndPorts.length() > 2){
String[] hostAndPortArray = hostsAndPorts.split(",");
for(int i = 0 ; i < hostAndPortArray.length ; i ++){
String hostAndPort = hostAndPortArray[i];
if(hostAndPort.contains(":")){
String host = "";
Integer port = 0;
String[] temp = hostAndPort.split(":");
host = temp[0];
if(temp.length > 1 && StringUtils.isNumeric(temp[1])){
port = Integer.parseInt(temp[1]);
}
if(host.length() > 0 && port > 0){
ServerAddress serverAddress = new ServerAddress(host,port);
serverAddresses.add(serverAddress);
}
}
}
}else{
for (String host : hosts) {
Integer index = hosts.indexOf(host);
Integer port = ports.get(index);
ServerAddress serverAddress = new ServerAddress(host, port);
serverAddresses.add(serverAddress);
}
}
// 连接认证
List<MongoCredential> mongoCredentialList = new ArrayList<>();
if (username != null && !username.equals("")) {
mongoCredentialList.add(MongoCredential.createScramSha1Credential(
username,
authenticationDatabase != null ? authenticationDatabase : database,
password.toCharArray()));
}
//创建客户端和Factory
MongoClient mongoClient = new MongoClient(serverAddresses, mongoCredentialList, mongoClientOptions);
MongoDbFactory mongoDbFactory = new SimpleMongoDbFactory(mongoClient, database);
return mongoDbFactory;
}
}