重试在套接字级别读取客户请求

Retry reading a customer request on socket level

我正在开发一种传输机制,如果内部队列已满,我应该忽略套接字上的 OP_READ 事件。

  SelectionKey next = it.next();

  if (next.isReadable()) {
      SocketChannel client = (SocketChannel) next.channel();

      if (!innerqueueIsFull()) {
           if (client.read(nextRead) == -1) {
                 break;
           }
      }
   }

在为其中一个待处理的请求写入响应后,我想返回并重试读取通道上的数据包。如何重试阅读请求?

I'm working on a transport mechanism, where I am supposed to ignore OP_READ events on a socket, if the internal queue is already full.

正确的做法是取消注册该频道的 OP_READ 兴趣,如果只有一个内部队列,则取消所有频道的兴趣。那么你甚至不会在频道上获得 isReadable() 事件。当队列清空后,重新注册OP_READ.

效果将阻止受影响的对等方发送。

How can I retry reading the request?

您不必以这种方式重试任何事情。以正常方式对 isReadable() 做出反应即可。事实上,您也不必按自己的方式重试任何事情,因为您一开始就没有进行读取,所以没有什么可重试的。

注意如果 client.read() returns -1 对 break 来说是完全奇怪的。您应该关闭通道继续。没有理由仅仅因为一个客户端断开连接而不处理其他事件。