package org.springframework.cloud.service;
import org.springframework.util.StringUtils;
/**
* Configuration for pooling
*
* @author Ramnivas Laddad
* @author Mark Fisher
* @author Thomas Risberg
*/
public class PooledServiceConnectorConfig implements ServiceConnectorConfig {
private PoolConfig poolConfig;
public PooledServiceConnectorConfig(PoolConfig poolConfig) {
this.poolConfig = poolConfig;
}
public PoolConfig getPoolConfig() {
return poolConfig;
}
public static class PoolConfig {
private int minPoolSize;
private int maxPoolSize;
private int maxWaitTime;
public PoolConfig(int minPoolSize, int maxPoolSize, int maxWaitTime) {
this.minPoolSize = minPoolSize;
this.maxPoolSize = maxPoolSize;
this.maxWaitTime = maxWaitTime;
}
public PoolConfig(int maxPoolSize, int maxWaitTime) {
this(0, maxPoolSize, maxWaitTime);
}
public PoolConfig(String poolSize, int maxWaitTime) {
determinePoolSizeRange(poolSize);
this.maxWaitTime = maxWaitTime;
}
/**
* @return property corresponding to DBCP {@code initialSize}
*/
public int getInitialSize() {
return minPoolSize;
}
/**
* @return property corresponding to DBCP {@code minIdle}
*/
public int getMinIdle() {
return minPoolSize;
}
/**
* @return property corresponding to DBCP {@code maxActive}
*/
public int getMaxActive() {
return maxPoolSize;
}
/**
* @return property corresponding to DBCP {@code maxWait}
*/
public int getMaxWait() {
return maxWaitTime;
}
/**
* @return property corresponding to commons-pool {@code maxTotal}
*/
public int getMaxTotal() {
return maxPoolSize;
}
/**
* @return property corresponding to commons-pool {@code maxWaitMillis}
*/
public int getMaxWaitMillis() {
return maxWaitTime;
}
/**
* @return property corresponding to HikariCP {@code minimumIdle}
*/
public int getMinimumIdle() {
return minPoolSize;
}
/**
* @return property corresponding to HikariCP {@code maximumPoolSize}
*/
public int getMaximumPoolSize() {
return maxPoolSize;
}
private void determinePoolSizeRange(String poolSize) {
if (StringUtils.hasText(poolSize)) {
try {
int minPoolSize;
int maxPoolSize;
int separatorIndex = poolSize.indexOf('-');
if (separatorIndex != -1) {
minPoolSize = Integer.valueOf(poolSize.substring(0, separatorIndex));
maxPoolSize = Integer.valueOf(poolSize.substring(separatorIndex + 1, poolSize.length()));
if (minPoolSize > maxPoolSize) {
throw new IllegalArgumentException(
"Lower bound of pool-size range must not exceed the upper bound");
}
} else {
Integer value = Integer.valueOf(poolSize);
minPoolSize = 0;
maxPoolSize = value;
}
this.minPoolSize = Integer.valueOf(minPoolSize);
this.maxPoolSize = Integer.valueOf(maxPoolSize);
} catch (NumberFormatException ex) {
throw new IllegalArgumentException("Invalid pool-size value [" + poolSize + "]: only single " +
"maximum integer (e.g. \"5\") and minimum-maximum range (e.g. \"3-5\") are supported", ex);
}
}
}
}
}