package com.justdebugit.thrift.client; import java.io.Closeable; import java.io.IOException; import java.lang.reflect.Constructor; import java.net.InetSocketAddress; import java.util.concurrent.ConcurrentMap; import org.apache.thrift.TException; import org.apache.thrift.protocol.TCompactProtocol; import org.apache.thrift.protocol.TMultiplexedProtocol; import org.apache.thrift.protocol.TProtocol; import org.apache.thrift.transport.TFramedTransport; import org.apache.thrift.transport.TSocket; import org.apache.thrift.transport.TTransportException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.collect.Maps; import com.justdebugit.thrift.utils.ReflectUtils; public class DefaultThrfitClientFactory implements ThriftClientFactory{ private static final Logger LOGGER = LoggerFactory.getLogger(DefaultThrfitClientFactory.class); private ConcurrentMap<Object, Closeable> clientMap = Maps.newConcurrentMap(); @SuppressWarnings("unchecked") @Override public <T> T createClient(String serviceName,Class<T> clazz, InetSocketAddress address) { Constructor<?> constructor =null; try { constructor = ReflectUtils.findConstructor(clazz, TProtocol.class); } catch (NoSuchMethodException e) { LOGGER.error(e.getMessage(),e); throw new IllegalStateException("There is proper constructor "+e); } TFramedTransport transport = new TFramedTransport(new TSocket(address.getHostName(), address.getPort())); try { transport.open(); } catch (TTransportException e) { LOGGER.error(e.getMessage(),e); transport.close(); throw new IllegalStateException("Can not connect to remote host "+e); } T client = null; try { client = (T)constructor.newInstance(new TMultiplexedProtocol(new TCompactProtocol(transport), serviceName)); clientMap.putIfAbsent(client, transport); } catch (Exception e) { transport.close(); throw new IllegalStateException("Can not create instance clazz "+e); } return client; } @Override public <T> void destroyClient(T client) throws TException { Closeable transport = clientMap.get(client); try { transport.close(); } catch (IOException e) { throw new TException(e.getMessage(),e); } } }