Hadoop源码分析14: IPC流程(9) SelectionKey

1.SelectionKey.OP_ACCEPT

 

publicclassServerListenerextendsThread{

 

      publicServerListener(Serverserver) throwsIOException{

             this.server=server;

             address=newInetSocketAddress(server.bindAddress,server.port);

             // Create anew server socket and set to non blocking mode

             acceptChannel= ServerSocketChannel.open();

             acceptChannel.configureBlocking(false);

 

             // Bind theserver socket to the local host and port

             Server.bind(acceptChannel.socket(),address, backlogLength);

             server.port=acceptChannel.socket().getLocalPort(); 

             // create aselector;

             selector =Selector.open();

             readers=newServerListenerReader[server.readThreads];

             readPool=Executors.newFixedThreadPool(server.readThreads);

             for(inti = 0;i server.readThreads;i++) {

                    Selector readSelector = Selector.open();

                    ServerListenerReader reader = newServerListenerReader(

                                 readSelector, this);

                    readers[i]= reader;

                   readPool.execute(reader);

             }

 

             acceptChannel.register(selector,SelectionKey.OP_ACCEPT);

             this.setName("IPCServer listener on " +server.port);

             this.setDaemon(true);

      }

}

2. SelectionKey.OP_READ

 

public classServerListenerextends Thread{

 

     voiddoAccept(SelectionKeykey) throwsIOException,OutOfMemoryError {

             ServerConnection c = null;

             ServerSocketChannel serverSocketChannel=(ServerSocketChannel)key.channel();

             SocketChannel channel;

             while((channel=serverSocketChannel.accept())!= null){

                    channel.configureBlocking(false);

                    channel.socket().setTcpNoDelay(this.server.tcpNoDelay);

                    ServerListenerReader reader = readers[(currentReader+ 1) %readers.length];

                    try{

                          reader.startAdd();

                          SelectionKey readKey = channel.register(reader.readSelector,SelectionKey.OP_READ);

                          c = newServerConnection(readKey,channel,

                                        System.currentTimeMillis(), this.server);

                          readKey.attach(c);

                          synchronized(this.server.connectionList){

                                 this.server.connectionList.add(this.server.numConnections,

                                               c);

                                 this.server.numConnections++;

                          }

 

                    } finally{

                          reader.finishAdd();

                    }

 

             }

      }

 

}

3. SelectionKey.OP_WRITE

publicclassServerResponderextendsThread{

 

privatebooleanprocessResponse(LinkedListCallresponseQueue,

                                   booleaninHandler)throwsIOException{

     booleanerror= true;

     booleandone =false;      

     intnumElements =0;

     Call call = null;

     try{

       synchronized(responseQueue){

        

         numElements = responseQueue.size();

         if(numElements== 0) {

           error = false;

           returntrue;             // no moredata for this channel.

         }

 

         call = responseQueue.removeFirst();

         SocketChannelchannel = call.connection.channel;

  

         intnumBytes =channelWrite(channel, call.response);

         if(numBytes0){

           returntrue;

         }

         if(!call.response.hasRemaining()){

           call.connection.decRpcCount();

           if(numElements== 1){   // last callfully processes.

             done = true;            // no moredata for this channel.

           } else{

             done = false;           // morecalls pending to be sent.

           }

 

         } else{

          

           call.connection.responseQueue.addFirst(call);

           

           if(inHandler){

             // set theserve time when the response has to be sent later

             call.timestamp=System.currentTimeMillis();

             

             incPending();

             try

               writeSelector.wakeup();

               channel.register(writeSelector, SelectionKey.OP_WRITE,call);

             } catch(ClosedChannelExceptione) {

               //Its ok.channel might be closed else where.

               done = true;

             } finally{

               decPending();

             }

           } 

         }

         error = false;             //everything went off well

       }

     } finally{

       if(error&& call != null){ 

         done = true;              // error. nomore data for this channel.

         closeConnection(call.connection);

       }

     }

     returndone;

   }

}

 

 

 

转载于:https://www.cnblogs.com/leeeee/p/7276521.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值