/** * */ package vnet.routing.netty.server.support.test; import org.jboss.netty.channel.ChannelFuture; import org.jboss.netty.channel.ChannelFutureListener; import org.jboss.netty.channel.ChannelHandlerContext; import org.jboss.netty.channel.ChannelStateEvent; import org.jboss.netty.channel.Channels; import org.jboss.netty.channel.ExceptionEvent; import org.jboss.netty.channel.MessageEvent; import org.jboss.netty.channel.SimpleChannelUpstreamHandler; import org.jboss.netty.channel.group.ChannelGroup; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * @author obergner * */ public class EchoServerHandler extends SimpleChannelUpstreamHandler { private final Logger log = LoggerFactory.getLogger(getClass()); private final ChannelGroup allChannels; public EchoServerHandler(final ChannelGroup allChannels) { this.allChannels = allChannels; } @Override public void channelOpen(final ChannelHandlerContext ctx, final ChannelStateEvent e) throws Exception { this.allChannels.add(e.getChannel()); ctx.sendUpstream(e); } @Override public void messageReceived(final ChannelHandlerContext ctx, final MessageEvent e) throws Exception { final Object message = e.getMessage(); this.log.debug("Received echo message [{}]", message); final ChannelFuture messageHasBeenEchoed = Channels.write( e.getChannel(), message); messageHasBeenEchoed.addListener(new ChannelFutureListener() { @Override public void operationComplete(final ChannelFuture future) throws Exception { if (!future.isSuccess()) { EchoServerHandler.this.log.error("Failed to echo message [" + message + "]: " + future.getCause().getMessage(), future.getCause()); future.getChannel().close(); } else { EchoServerHandler.this.log.debug("Echoed message [{}]", message); } } }); } @Override public void exceptionCaught(final ChannelHandlerContext ctx, final ExceptionEvent e) throws Exception { this.log.error("Caught exception from downstream: " + e.getCause(), e.getCause()); e.getChannel().close(); } }