package common; import org.apache.commons.pool2.PooledObject; import org.apache.commons.pool2.PooledObjectFactory; import org.apache.commons.pool2.impl.DefaultPooledObject; import org.apache.thrift.protocol.TBinaryProtocol; import org.apache.thrift.protocol.TProtocol; import org.apache.thrift.transport.TSocket; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.net.InetSocketAddress; /** * Created by andrew on 12/2/14. */ public class ThriftConnectionFactory<T extends org.apache.thrift.TServiceClient> implements PooledObjectFactory<T> { private final InetSocketAddress address; private final int timeout; private final Constructor<? extends T> clientCtor; public ThriftConnectionFactory(InetSocketAddress address, int timeout, Constructor<? extends T> clientCtor) { this.address = address; this.timeout = timeout; this.clientCtor = clientCtor; } @Override public PooledObject<T> makeObject() throws Exception { TSocket transport = new TSocket(address.getHostName(), address.getPort(), timeout); transport.open(); TProtocol protocol = new TBinaryProtocol(transport); T client = null; try { client = clientCtor.newInstance(protocol); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } return new DefaultPooledObject<T>(client); } @Override public void destroyObject(PooledObject<T> pooledObject) throws Exception { pooledObject.getObject().getOutputProtocol().getTransport().close(); } @Override public boolean validateObject(PooledObject<T> o) { return o.getObject().getOutputProtocol().getTransport().isOpen() && o.getObject().getInputProtocol().getTransport().isOpen(); } @Override public void activateObject(PooledObject<T> pooledObject) throws Exception { } @Override public void passivateObject(PooledObject<T> pooledObject) throws Exception { } }