// Copyright © 2011-2013, Esko Luontola <www.orfjackal.net>
// This software is released under the Apache License 2.0.
// The license text is at http://www.apache.org/licenses/LICENSE-2.0
package fi.jumi.core.network;
import org.jboss.netty.bootstrap.ClientBootstrap;
import org.jboss.netty.channel.*;
import org.jboss.netty.channel.group.*;
import org.jboss.netty.channel.socket.oio.OioClientSocketChannelFactory;
import org.jboss.netty.handler.codec.serialization.*;
import org.jboss.netty.handler.logging.LoggingHandler;
import org.jboss.netty.logging.InternalLogLevel;
import javax.annotation.concurrent.ThreadSafe;
import java.net.InetSocketAddress;
import java.util.concurrent.*;
@ThreadSafe
public class NettyNetworkClient implements NetworkClient {
private final ChannelGroup allChannels = new DefaultChannelGroup();
private final InternalLogLevel logLevel;
private final ChannelFactory channelFactory;
public NettyNetworkClient() {
this(false);
}
public NettyNetworkClient(boolean logging) {
this(logging, Executors.newCachedThreadPool());
}
public NettyNetworkClient(boolean logging, ExecutorService workerExecutor) {
this.logLevel = logging ? InternalLogLevel.INFO : InternalLogLevel.DEBUG;
this.channelFactory = new OioClientSocketChannelFactory(workerExecutor);
}
@Override
public <In, Out> void connect(String hostname, int port, NetworkEndpoint<In, Out> endpoint) {
ClientBootstrap bootstrap = new ClientBootstrap(channelFactory);
bootstrap.setPipelineFactory(
() -> Channels.pipeline(
new ObjectEncoder(),
new ObjectDecoder(ClassResolvers.softCachingResolver(getClass().getClassLoader())),
new LoggingHandler(NettyNetworkClient.class, logLevel),
new NettyNetworkEndpointAdapter<>(endpoint),
new AddToChannelGroupHandler(allChannels)));
bootstrap.setOption("tcpNoDelay", true);
bootstrap.setOption("keepAlive", true);
bootstrap.connect(new InetSocketAddress(hostname, port));
}
@Override
public void close() {
allChannels.close().awaitUninterruptibly();
channelFactory.releaseExternalResources();
}
}