package com.easyooo.framework.support.redis.shard;
import static org.springframework.util.Assert.notNull;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.InitializingBean;
import redis.clients.jedis.JedisShardInfo;
import redis.clients.jedis.ShardedJedisPool;
import com.easyooo.framework.common.net.HostAndPort;
/**
*
* Redis Client for multiple servers,
*
* 所有来自GenericObjectPoolConfig都可以通过setter method来设置
*
* @see GenericObjectPoolConfig
*
* @author Killer
*/
public class ShardedJedisClientFactoryBean extends GenericObjectPoolConfig
implements FactoryBean<ShardedJedisPool>, InitializingBean, DisposableBean {
private ShardedJedisPool shardedJedisPool;
private String connectionString;
@Override
public void destroy() throws Exception {
if(shardedJedisPool != null){
shardedJedisPool.destroy();
}
}
@Override
public ShardedJedisPool getObject() throws Exception {
return shardedJedisPool;
}
@Override
public Class<?> getObjectType() {
return ShardedJedisPool.class;
}
@Override
public boolean isSingleton() {
return true;
}
@Override
public void afterPropertiesSet() throws Exception {
notNull(connectionString, "Property 'connectionString' is required");
List<HostAndPort> haps = HostAndPort.fromStringArray(connectionString);
List<JedisShardInfo> jsi = new ArrayList<>();
for (HostAndPort hap : haps) {
jsi.add(new JedisShardInfo(hap.getHost(), hap.getPort()));
}
shardedJedisPool = new ShardedJedisPool(this, jsi);
}
public void setConnectionString(String connectionString) {
this.connectionString = connectionString;
}
}