Hadoop-0.20.0源代码分析(11)

这里分析一下IPC模型中的Server端的实现。该Server类的实现有点复杂,而且涉及到网络中字节流缓冲区的操作问题,及其字节数据的反序列化。

Server类

该Server是服务端的抽象实现,定义了一个抽象的IPC服务。 该IPC服务器接收Client发送的参数值,并返回响应值。同时,作为IPC模型的服务端,它要维护Client端到Server端的一组连接。

首先看Server类定义的几个属性:

一个Server实例的构造基本上基于上面的属性信息的,构造方法对一个Server实例进行初始化,包括一些静态信息如绑定地址、维护连接数量、队列等,还有一些用来处理Server端事务的线程等等。

先对Server类中定义的几个内部类来分析,这些类都是与Server端一些重要的事务的处理类。然后再分析Server类提供的全部基本操作。

  • Server.Call内部类

该类Server端使用队列维护的调用实体类,如下所示:

  • Server.Connection内部类

该类表示服务端一个连接的抽象,主要是读取从Client发送的调用,并把读取到的调用Client.Call实例加入到待处理的队列。

看如何构造一个Server.Connection对象:

另外,Server.Connection内部类中还定义了如下几个属性:

该内部类中,readAndProcess()方法读取远程过程调用的数据,从一个Server.Connection的Socket通道中读取数据,并将调用任务加入到callQueue,转交给Handler线程去处理。下面看下该方法的实现:

上面方法是接收调用数据的核心方法,实现了如何从SocketChannel通道中读取数据。其中processHeader方法与processData方法已经在上面种详细分析了,不再多说。

另外,作为Server.Connection是连接到客户端的,与客户端调用进行通信,所以一个连接定义了关闭的操作,关闭的时候需要关闭与客户端Socket关联的SocketChannel通道。

  • Server.Listener内部类

该类是继承自Thread线程类,用来监听服务器Socket,并未Handler处理器线程创建处理任务。从一个Listener线程类的构造来它需要初始化哪些必要信息:

该线程类定义的方法如下所示:

上面方法,是一个收集来自客户端的连接的实现。下面看一下监听线程的线程体部分实现:

可见,Server.Listener主要负责两个阶段的任务:当服务器运行时,不断地通过选择器来选择继续的通道,处理基于该选择的通道上通信;当服务器不再运行以后,需要关闭通道、选择器、全部链接,释放一切资源。

  • Server.Handler内部类

该类是一个处理线程类,负责处理客户端的全部调用。

该类的源代码如下所示:

该线程主要的任务是:真正地实现了处理来自客户端的调用,并设置每个相关调用的响应。关于响应的实现,有个具体实现的线程类Server.Responder。

  • Server.Responder内部类

该线程类实现发送RPC响应到客户端。

我们先对该线程类中方法进行阅读分析,然后再看线程体的实现过程。

上面方法主要实现的是,处理响应队列responseQueue中的全部调用Call,对应的响应数据。关于处理响应的调用队列,是指类似call.connection.responseQueue的响应队列,可以理解为某个通道上调用的集合所对应的待处理响应数据的队列。

看下面的doRespond方法:

当某个通道上可写的时候,可以执行异步写响应数据的操作,实现方法为:

再看doPurge方法:

最后,看一个Responder线程启动后,是如何工作的,在线程体run方法中可以看到:

通过线程执行可以看到,调用的相应数据的处理,是在服务器运行过程中处理的,而且分为两种情况:

1、一种情况是:如果某些调用超过了指定的时限而一直未被处理,这些调用被视为过期,服务器不会再为这些调用处理,而是直接清除掉;

2、另一种情况是:如果所选择的通道上,已经注册的调用是合法的,并且通道可写,会直接将调用的相应数据写入到通道,等待客户端读取。

 

上面实现的Server的内部类,基本上定义了一个Server应该实现的基本操作,下面再看Server类中就比较容易了。

启动服务器:

  

停止服务器:

通过对Server类的分析,应该能够了解IPC模型的Server端需要做哪些基本的事情。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值