加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

cindy源码阅读(8)Reactor

发布时间:2020-12-15 04:57:01 所属栏目:百科 来源:网络整理
导读:public interface Reactor { void register(ReactorHandler handler); void deregister(ReactorHandler handler); void interest(ReactorHandler handler,int ops); 看起来Reactor 是蛮简单的,但是却是困惑我最久的地方。 public void run() { try { while
public interface Reactor {

    void register(ReactorHandler handler);

    void deregister(ReactorHandler handler);

    void interest(ReactorHandler handler,int ops);


看起来Reactor 是蛮简单的,但是却是困惑我最久的地方。

  public void run() {
                    try {
                        while (!close) {
                            beforeSelect();
                            if (close) // after beforeSelect,close may be true
                                break;
                            try {
                                selector.select(SELECT_TIMEOUT);
                            } catch (IOException e) {
                                log.error(e,e);
                                break;
                            }
                            afterSelect();
                        }
                    } finally {
                        DefaultReactor.this.stop();
                    }
                }

Reactor启动之后,会不停的通过selector去查看各个频道的状态,然后通过ReactorHandler 执行对应状态的操作。

private void processSelectedKeys() {
        for (Iterator iter = selector.selectedKeys().iterator(); iter.hasNext();) {
            SelectionKey key = (SelectionKey) iter.next();
            iter.remove();

            key.interestOps(key.interestOps() & ~key.readyOps());
            Attachment attachment = (Attachment) key.attachment();
            ReactorHandler handler = attachment.handler;

            if (key.isWritable()) // do not check session timeout when writing
                attachment.writing = true;

            if (key.isAcceptable())
                handler.onAcceptable();
            if (key.isConnectable())
                handler.onConnectable();
            if (key.isValid() && key.isReadable())
                handler.onReadable();
            if (key.isValid() && key.isWritable())
                handler.onWritable();
        }
    }
那session的sockerchannel怎么和selector产生联系呢。通过register和deregister方法。那状态的改变呢,是通过interest方法。 ReactorHandler是怎么执行的呢。基本上是通过SessionFilterChain执行对应的方法。SessionFilter可以直接通过session添加:session.addSessionFilter(XXX);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读