Endpoint接口EndpointEndpoint类图总结AbstractPeer属性和构建方法实现Endpoint关闭相关方法实现endpoint#sendChannelHandler相关方法实现AbstractEndpoint-
Endpoint Dubbo将最终概念抽象出来。 也就是说,Endpoint接口端是点,点之间可以双向传输,基于终端,通道-通道、客户端和服务端-服务器的概念是传输层- ttr 和服务器上的意义。交换层-交换层不区分请求和响应角色,客户端和服务器也是一个点,但http://www.Sina.com/http://www . 只有客户端和服务器关注的不同,publicinterfaceendpoint {/* * * geturl.*获取方的URL对象* * @ return URL */URL geturl/* * * * 获取方的通道处理器* * * @ returnchannelhandler */channelhandlergetchannelhandler (); /** * get local address. *获取目标本地地址* * @ return local address.*/inetsocketaddressgetlocaladdress (); /** * send message. *消息* * @ param message * @ throwsremotingexception */void send (对象消息) throws remoting exception sent是否已经提交了标记* * @ param message * @ paramsentalreadysenttosocket? */void send (对象消息,布尔集) throws RemotingException; /** * close the channel. *频道*/void close ();/* * *图形关闭通道. *优雅关闭通道* /语音关闭(int time out ); /** *开始关闭*/void startClose (); /** * is closed. *关闭* * @ return closed */booleanisclosed (); }前三种方法是获取该终端自身的一些属性。 两种send方法为已经是 有方向的点,区分了明确的请求和应答职责,其中第二种方法增加了sent的一个参数。 为了区分最初是否发送了消息,以下几种方法提供了3358www.Sina.com/的操作和确定通道是否关闭的操作。 整个Endpoint类图
只有AbstractPeer才能实现Endpoint
继承Endpoint的是客户端、远程服务器和通道,稍后进行组织
总结Endpoint的重要方法包括:
消息关闭端获取端的通道处理器AbstractPeer AbstractPeer抽象类实现了端点接口-Endpoint和通道处理器接口-通道处理程序, 服务器和客户端的具体实现继承了AbstractPeer,从上面的类图中可以看到,AbstractPeer有两个子块: AbstractEndpoint和AbstractChannelAbstractPeer //closingclosedmeanstheprocessisbeingclosedandcloseisfinished//closing表示该进程已关闭专用卷
ean closing;// 关闭状态private volatile boolean closed;public AbstractPeer(URL url, ChannelHandler handler) {// …this.url = url;this.handler = handler;}@Overridepublic URL getUrl() {return url;}protected void setUrl(URL url) {// …this.url = url;}@Overridepublic ChannelHandler getChannelHandler() {if (handler instanceof ChannelHandlerDelegate) {return ((ChannelHandlerDelegate) handler).getHandler();} else {return handler;}} 实现Endpoint关闭相关方法
除了实现了Endpoint接口的close方法,同时增加了closing属性和关闭中方法
@Overridepublic void close() {closed = true;}@Overridepublic void close(int timeout) {close();}@Overridepublic void startClose() {if (isClosed()) {return;}closing = true;}@Overridepublic boolean isClosed() {return closed;}public boolean isClosing() {// closing=true 且 closed=false的时候,表示正在关闭return closing && !closed;} 实现Endpoint#send String SENT_KEY = “sent”;@Overridepublic void send(Object message) throws RemotingException {// 子类中实现send(message, url.getParameter(Constants.SENT_KEY, false));} 实现ChannelHandler相关方法
都交由ChannelHandler处理
@Overridepublic void connected(Channel ch) throws RemotingException {if (closed) {return;}handler.connected(ch);}@Overridepublic void disconnected(Channel ch) throws RemotingException {handler.disconnected(ch);}@Overridepublic void sent(Channel ch, Object msg) throws RemotingException {if (closed) {return;}handler.sent(ch, msg);}@Overridepublic void received(Channel ch, Object msg) throws RemotingException {if (closed) {return;}handler.received(ch, msg);}@Overridepublic void caught(Channel ch, Throwable ex) throws RemotingException {handler.caught(ch, ex);} AbstractEndpoint-端点抽象类 AbstractEndpoint 继承了AbstractPeer,也就和AbstractPeer一样 持有 URL 与 ChannelHandler 的关系AbstractEndpoint 还包含有 超时时间 和 编解码器-Codec2扩展从上面的类图中可以看到,AbstractEndpoint的子类有 AbstractServer、AbstractClient,会在后面介绍 属性及构造方法 private Codec2 codec;private int timeout;private int connectTimeout;public AbstractEndpoint(URL url, ChannelHandler handler) {// AbstractPeer的构造方法super(url, handler);this.codec = getChannelCodec(url);this.timeout = url.getPositiveParameter(TIMEOUT_KEY, DEFAULT_TIMEOUT);this.connectTimeout = url.getPositiveParameter(Constants.CONNECT_TIMEOUT_KEY, Constants.DEFAULT_CONNECT_TIMEOUT);}protected Codec2 getCodec() {return codec;} protected int getTimeout() {return timeout;}protected int getConnectTimeout() {return connectTimeout;} getChannelCodec
针对编解码器的设置其实是根据URL中的protocol参数得到的
编解码器的相关内容可以在Dubbo编解码(二)-Codec2和AbstractCodec中看到
protected static Codec2 getChannelCodec(URL url) {String codecName = url.getProtocol(); // codec extension name must stay the same with protocol nameif (ExtensionLoader.getExtensionLoader(Codec2.class).hasExtension(codecName)) {return ExtensionLoader.getExtensionLoader(Codec2.class).getExtension(codecName);} else {return new CodecAdapter(ExtensionLoader.getExtensionLoader(Codec.class).getExtension(codecName));}} AbstractChannel(待完善)