package com.lefu.remote.netty;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.timeout.IdleStateHandler;
import io.netty.handler.timeout.ReadTimeoutHandler;
/**
* 提供了基础的超时和空闲句柄
* @author jiang.li
* @see io.netty.handler.timeout.ReadTimeoutHandler
* @see io.netty.handler.timeout.IdleStateHandler
*/
public abstract class AbstractChannelInitializer extends ChannelInitializer<SocketChannel> {
private boolean enableTimeoutHandler = false;
private boolean enableIdleHandler = true;
protected int timeout = 90;
protected int readIdleTime = 30;
protected int writeIdleTime = 0;
protected int bothIdleTime = 0;
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline p = ch.pipeline();
if(enableTimeoutHandler) p.addLast(new ReadTimeoutHandler(timeout));
if(enableIdleHandler) p.addLast(new IdleStateHandler(readIdleTime, writeIdleTime,bothIdleTime));
doInitChannel(ch);
}
/**
* 在配置业务 Handler 之前进行超时和空闲的 Handler 的注册
* @param ch
* @throws Exception
*/
public abstract void doInitChannel(SocketChannel ch) throws Exception;
/**
* 设置超时时间
* @param timeout 单位秒
*/
public void setTimeout(int timeout) {
this.timeout = timeout;
}
/**
* 读超时时间,单位秒,小于等于0的值无效
* @param readIdleTime
*/
public void setReadIdleTime(int readIdleTime) {
this.readIdleTime = readIdleTime;
}
/**
* 写超时时间,单位秒,小于等于0的值无效
* @param writeIdleTime
*/
public void setWriteIdleTime(int writeIdleTime) {
this.writeIdleTime = writeIdleTime;
}
/**
* 共同的超时时间,单位秒,小于等于0的值无效
* @param bothIdleTime
*/
public void setBothIdleTime(int bothIdleTime) {
this.bothIdleTime = bothIdleTime;
}
/**
* 是否启用超时 Handler
* <pre>注意:设置超时句柄后,超时触发时会关闭连接</pre>
* @param enableTimeoutHandler
*/
public void setEnableTimeoutHandler(boolean enableTimeoutHandler) {
this.enableTimeoutHandler = enableTimeoutHandler;
}
/**
* 是否启用空闲 Handler
* @param enableIdleHandler
*/
public void setEnableIdleHandler(boolean enableIdleHandler) {
this.enableIdleHandler = enableIdleHandler;
}
}