重试在套接字级别读取客户请求
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
来说是完全奇怪的。您应该关闭通道并继续。没有理由仅仅因为一个客户端断开连接而不处理其他事件。
我正在开发一种传输机制,如果内部队列已满,我应该忽略套接字上的 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
来说是完全奇怪的。您应该关闭通道并继续。没有理由仅仅因为一个客户端断开连接而不处理其他事件。