package org.rzo.netty.ahessian.rpc.client;
import java.net.ConnectException;
import java.util.Timer;
import java.util.TimerTask;
import org.jboss.netty.channel.ChannelFuture;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.ChannelStateEvent;
import org.jboss.netty.channel.ExceptionEvent;
import org.jboss.netty.channel.SimpleChannelUpstreamHandler;
import org.rzo.netty.ahessian.Constants;
public class ReconnectHandler extends SimpleChannelUpstreamHandler
{
private static Timer timer = new Timer();
private long RECONNECT_DELAY = 5000;
private BootstrapProvider _bootstrap;
public ReconnectHandler(BootstrapProvider bootstrap, long reconnectDelay)
{
RECONNECT_DELAY = reconnectDelay;
_bootstrap = bootstrap;
}
public ReconnectHandler(BootstrapProvider bootstrap)
{
_bootstrap = bootstrap;
}
@Override
public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e) {
ctx.sendUpstream(e);
Constants.ahessianLogger.warn("channel closed wait to reconnect ...");
timer.schedule(new TimerTask() {
public void run() {
Constants.ahessianLogger.warn("reconnecting...");
ChannelFuture f = _bootstrap.getBootstrap().connect();
try
{
f.awaitUninterruptibly();
}
catch (Exception e)
{
// TODO Auto-generated catch block
Constants.ahessianLogger.warn("", e);
}
if (f.isSuccess())
Constants.ahessianLogger.warn("connected");
else
{
Constants.ahessianLogger.warn("not connected");
}
}
}, RECONNECT_DELAY);
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) {
Throwable cause = e.getCause();
cause.printStackTrace();
if (cause instanceof ConnectException)
{
Constants.ahessianLogger.warn("conection lost");
}
try
{
ctx.getChannel().close();
}
catch (Exception ex)
{
}
}
}