首页 > 代码库 > Netty3 源码分析 - ChannelStateEvent

Netty3 源码分析 - ChannelStateEvent

Netty3 源码分析 - ChannelStateEvent

ChannelStateEvent是ChannelEvent的子接口,可以代表改变的通知或者是请求,取决于它是上行还是下行事件。

UpstreamChannelStateEvent是默认的上行通道状态事件实现类。结合ChannelState中的表很容易看懂源码。
DownstreamChannelStateEvent是默认的下行通道状态事件实现类。不同的是需要指定一个Future对象,当相应的动作完成后得到通知。源码很容易理解:
public class DownstreamChannelStateEvent implements ChannelStateEvent {

    private final Channel channel;
    private final ChannelFuture future;
    private final ChannelState state;
    private final Object value;

    //和UpstreamChannelStateEvent不同的是,多了一个Future对象,需要合适的时候得到通知
    public DownstreamChannelStateEvent(
            Channel channel, ChannelFuture future,
            ChannelState state, Object value) {

        if (channel == null) {
            throw new NullPointerException( "channel");
        }
        if (future == null) {
            throw new NullPointerException( "future");
        }
        if (state == null) {
            throw new NullPointerException( "state");
        }
        this. channel = channel;
        this. future = future;
        this. state = state;
        this. value = value;
    }

    public Channel getChannel() {
        return channel;
    }

    public ChannelFuture getFuture() {
        return future;
    }

    public ChannelState getState() {
        return state;
    }

    public Object getValue() {
        return value;
    }

    @Override
    public String toString() {
        String channelString = getChannel().toString();
        StringBuilder buf = new StringBuilder(channelString.length() + 64);
        buf.append(channelString);
        switch (getState()) {
        case OPEN:
            if (Boolean. TRUE.equals(getValue())) {
                buf.append( " OPEN");
            } else {
                buf.append( " CLOSE");
            }
            break;
        case BOUND:
            if (getValue() != null) {
                buf.append( " BIND: ");
                buf.append(getValue());
            } else {
                buf.append( " UNBIND");
            }
            break;
        case CONNECTED:
            if (getValue() != null) {
                buf.append( " CONNECT: ");
                buf.append(getValue());
            } else {
                buf.append( " DISCONNECT");
            }
            break;
        case INTEREST_OPS:
            buf.append( " CHANGE_INTEREST: " );
            buf.append(getValue());
            break;
        default:
            buf.append( ‘ ‘);
            buf.append(getState().name());
            buf.append( ": ");
            buf.append(getValue());
        }
        return buf.toString();
    }
}








Netty3 源码分析 - ChannelStateEvent