package kr.debop4j.core.pool; import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; import org.apache.commons.pool.BasePoolableObjectFactory; import org.apache.commons.pool.impl.GenericObjectPool; import java.net.URI; import java.util.Properties; /** * kr.debop4j.core.pool.Pool * * @author 배성혁 ( sunghyouk.bae@gmail.com ) * @since 13. 4. 8. 오전 10:31 */ @Slf4j @Getter @Setter public class Pool extends AbstractPool<PoolObject> { public Pool(final GenericObjectPool.Config poolConfig, final Properties props) { super(poolConfig, new PoolObjectFactory(props)); } /** * 더 이상 재 사용할 수 없는 리소스에 대해 pooling 을 하지 않도록 합니다. * * @param resource */ @Override public void returnBrokenResource(PoolObject resource) { returnBrokenResourceObject(resource); } /** * 재사용을 위해 리소스를 풀에 반환합니다. * * @param resource */ @Override public void returnResource(final PoolObject resource) { returnResourceObject(resource); } public static class PoolObjectFactory extends BasePoolableObjectFactory<PoolObject> { private Properties props; private String name; private Integer intValue; private URI uriValue; public PoolObjectFactory(Properties props) { this.props = props; this.name = props.getProperty("pool.name", "name"); this.intValue = Integer.decode(props.getProperty("pool.intValue", "1")); this.uriValue = URI.create(props.getProperty("pool.uriValue", "http://localhost")); } @Override public PoolObject makeObject() throws Exception { final PoolObject po = new PoolObject(name, intValue, uriValue); po.setIsActive(true); return po; } @Override public void destroyObject(PoolObject obj) throws Exception { final PoolObject po = (PoolObject) obj; if (po.getIsActive()) { po.setIsActive(false); } } @Override public boolean validateObject(PoolObject obj) { final PoolObject po = (PoolObject) obj; return po.getIsActive(); } } }