package code.google.nfs.rpc.mina2.client; /** * nfs-rpc * Apache License * * http://code.google.com/p/nfs-rpc (c) 2011 */ import java.net.InetSocketAddress; import java.net.SocketAddress; import java.util.concurrent.Executors; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.mina.core.future.ConnectFuture; import org.apache.mina.core.session.IoSession; import org.apache.mina.filter.executor.ExecutorFilter; import org.apache.mina.transport.socket.SocketConnector; import org.apache.mina.transport.socket.nio.NioSocketConnector; import code.google.nfs.rpc.client.AbstractClientFactory; import code.google.nfs.rpc.client.Client; import code.google.nfs.rpc.mina2.serialize.MinaProtocolCodecFilter; /** * Mina Client Factory * * @author <a href="mailto:bluedavy@gmail.com">bluedavy</a> */ public class MinaClientFactory extends AbstractClientFactory { private static Log LOGGER = LogFactory.getLog(MinaClientFactory.class); private static final boolean isDebugEnabled = LOGGER.isDebugEnabled(); private static final int processorCount = Runtime.getRuntime().availableProcessors() + 1; private static final AbstractClientFactory _self = new MinaClientFactory(); private SocketConnector ioConnector; private MinaClientFactory() { // only one ioConnector,avoid create too many io processor thread ioConnector = new NioSocketConnector(processorCount); // ioConnector.getFilterChain().addLast("executor", new ExecutorFilter(Executors.newCachedThreadPool())); ioConnector.getSessionConfig().setTcpNoDelay(Boolean.parseBoolean(System.getProperty("nfs.rpc.tcp.nodelay", "true"))); ioConnector.getSessionConfig().setReuseAddress(true); ioConnector.getFilterChain().addLast("objectserialize",new MinaProtocolCodecFilter()); } public static AbstractClientFactory getInstance() { return _self; } protected Client createClient(String targetIP, int targetPort, int connectTimeout, String key) throws Exception { if (isDebugEnabled) { LOGGER.debug("create connection to :" + targetIP + ":" + targetPort + ",timeout is:" + connectTimeout + ",key is:" + key); } if (connectTimeout > 1000) { ioConnector.setConnectTimeoutMillis((int) connectTimeout); } else { ioConnector.setConnectTimeoutMillis(1000); } SocketAddress targetAddress = new InetSocketAddress(targetIP,targetPort); MinaClientProcessor processor = new MinaClientProcessor(this, key); ioConnector.setHandler(processor); ConnectFuture connectFuture = ioConnector.connect(targetAddress); // wait for connection established connectFuture.awaitUninterruptibly(); IoSession ioSession = connectFuture.getSession(); if ((ioSession == null) || (!ioSession.isConnected())) { String targetUrl = targetIP + ":" + targetPort; LOGGER.error("create connection error,targetaddress is " + targetUrl); throw new Exception("create connection error,targetaddress is " + targetUrl); } if (isDebugEnabled) { LOGGER.debug("create connection to :" + targetIP + ":" + targetPort + ",timeout is:" + connectTimeout + ",key is:" + key + " successed"); } MinaClient client = new MinaClient(ioSession, key, connectTimeout); processor.setClient(client); return client; } }