仿写hadoop1.0.0自带的RPC框架
hadoop RPC框架主要包括两个组件,服务端和客户端。服务端包括一个listener线程,一组Reader线程,一组Handle线程和一个Responder线程。listener线程包含一个SocketChannel和一个Selector,只负责监听客户端连接。每个Reader线程包含一个独有的Selector,每当Listener线程监听到客户端连接后就取一个Reader并向其注册一个read事件。Reader负责读取客户端请求,并将其包装成一个Call放入阻塞队列calls。Handle负责处理阻塞队列的call处理。然后处理的结果先自己发送,如果发送的完就结束此次请求,如果没法发送完就交给Responder去处理。Responder也是一个拥有Selector的线程,只负责处理写时间。
解决方案:
最终发现并不是死锁的问题,而是每次先读取对象大小紧接着就读取对象,但是实际上中间会有延迟导致读取对象读到的数据为0,所以要做一个循环判断读取数据是否为0.
channel.read()
方法返回值为为负数的时候就将channel关闭