Dubbo-聊聊通信模块设计( 六 )

AbstractClientAbstractClient是对客户端的抽象,同样它的继承和AbstractServer也一样 , 只是在实现不同而已,接下来我们来看看AbstractClient的实现,该类内部有4个关键的字段,对于executor和executorRepository这两个字段与AbstractServer功能类似,这里重点来介绍connectLock和needReconnect,connectLock是当客户端进行连接、断开、重连等操作时,需要获取该锁进行同步操作,needReconnect 在客户端发送数据之前,会检查客户端的连接是否断开,如果断开了,则会根据needReconnect字段,决定是否重连 。AbstractClient整体的初始化是在构造函数实现的 , 我们可以看到AbstractClient 定义了 doOpen、doClose、doConnect和doDisConnect四个抽象方法给子类实现,整体的设计与AbstractServer类似 。
    public AbstractClient(URL url, ChannelHandler handler) throws RemotingException {        //调用父类构造方法        super(url, handler);        //从URL获取是否重连字段 默认是        needReconnect = url.getParameter(Constants.SEND_RECONNECT_KEY, true);        //初始化Executor        initExecutor(url);        try {            //初始化具体的底层实现client            doOpen();        } catch (Throwable t) {            //关闭            close();            throw new RemotingException(url.toInetSocketAddress(), null,                    "Failed to start " + getClass().getSimpleName() + " " + NetUtils.getLocalAddress()                            + " connect to the server " + getRemoteAddress() + ", cause: " + t.getMessage(), t);        }        try {            //创建连接            connect();            if (logger.isInfoEnabled()) {                logger.info("Start " + getClass().getSimpleName() + " " + NetUtils.getLocalAddress() + " connect to the server " + getRemoteAddress());            }        } catch (RemotingException t) {            if (url.getParameter(Constants.CHECK_KEY, true)) {                close();                throw t;            } else {                logger.warn("Failed to start " + getClass().getSimpleName() + " " + NetUtils.getLocalAddress()                        + " connect to the server " + getRemoteAddress() + " (check == false, ignore and retry later!), cause: " + t.getMessage(), t);            }        } catch (Throwable t) {            close();            throw new RemotingException(url.toInetSocketAddress(), null,                    "Failed to start " + getClass().getSimpleName() + " " + NetUtils.getLocalAddress()                            + " connect to the server " + getRemoteAddress() + ", cause: " + t.getMessage(), t);        }    }

推荐阅读