package code.google.nfs.rpc.grizzly.client; /** * nfs-rpc * Apache License * * http://code.google.com/p/nfs-rpc (c) 2011 */ import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import org.glassfish.grizzly.Connection; import org.glassfish.grizzly.filterchain.FilterChainBuilder; import org.glassfish.grizzly.filterchain.TransportFilter; import org.glassfish.grizzly.nio.transport.TCPNIOTransport; import org.glassfish.grizzly.nio.transport.TCPNIOTransportBuilder; import code.google.nfs.rpc.client.AbstractClientFactory; import code.google.nfs.rpc.client.Client; import code.google.nfs.rpc.client.ClientFactory; import code.google.nfs.rpc.grizzly.serialize.GrizzlyProtocolFilter; import org.glassfish.grizzly.strategies.SameThreadIOStrategy; /** * Grizzly Client Factory * * @author <a href="mailto:bluedavy@gmail.com">bluedavy</a> */ public class GrizzlyClientFactory extends AbstractClientFactory { private static final ClientFactory _self = new GrizzlyClientFactory(); private GrizzlyClientFactory() { ; } public static ClientFactory getInstance() { return _self; } @SuppressWarnings("rawtypes") protected Client createClient(String targetIP, int targetPort, int connectTimeout, String key) throws Exception { Connection connection = null; GrizzlyClientHandler handler = new GrizzlyClientHandler(); FilterChainBuilder filterChainBuilder = FilterChainBuilder.stateless(); filterChainBuilder.add(new TransportFilter()); filterChainBuilder.add(new GrizzlyProtocolFilter()); filterChainBuilder.add(handler); final TCPNIOTransportBuilder transportBuilder = TCPNIOTransportBuilder.newInstance(); transportBuilder.setOptimizedForMultiplexing(true); transportBuilder.setIOStrategy(SameThreadIOStrategy.getInstance()); final TCPNIOTransport transport = transportBuilder.build(); transport.setTcpNoDelay(Boolean.parseBoolean(System.getProperty("nfs.rpc.tcp.nodelay", "true"))); transport.setProcessor(filterChainBuilder.build()); transport.start(); Future<Connection> future = transport.connect(targetIP, targetPort); if (connectTimeout < 1000) { connectTimeout = 1000; } connection = future.get(connectTimeout, TimeUnit.MILLISECONDS); @SuppressWarnings("unchecked") GrizzlyClient client = new GrizzlyClient(targetIP, targetPort, connectTimeout, connection, key); handler.setClient(client); return client; } }