Иногда я сталкивался со случаем, когда SocketChannel.read()
блокирует неблокирующий канал (варианты JDK 1.6 на RH6). Мое чтение спецификации говорит, что это никогда не должно происходить. После добавления большого тайм-аута в сокет (который, я думаю, никогда не понадобится...), я вижу следующее:
java.io.IOException: Connection timed out
at sun.nio.ch.FileDispatcherImpl.read0(Native method)
...
at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:380)
...
Глядя на источник, это просто вызов read()
, который, по-видимому, не должен блокироваться в файле. дескриптор с установленным O_NONBLOCK.
(Это может быть похоже на: SocketChannel.read() блокирует на неопределенный срок, однако в моем случае канал определенно был настроен как неблокирующий, и синхронизация действительно не должна иметь здесь значения, ИМХО, поскольку вызов не должен блокироваться независимо от любых других соображений.)
Я знаю, что неблокирующий read()
может заблокироваться из-за, скажем, пейджинга, но время ожидания моего сокета установлено на несколько минут, поэтому пейджинг не может быть виновником.
Любые идеи?
Код установки:
public void addConnection(SocketChannel channel) throws SocketException {
channel.socket().setTcpNoDelay(true);
channel.socket().setReceiveBufferSize(defReceiveBufferSize);
channel.socket().setSendBufferSize(defSendBufferSize);
channel.socket().setSoTimeout(defSocketReadTimeout);
try {
channel.configureBlocking(false);
} catch (IOException ioe) {
Log.logErrorWarning(ioe);
throw new RuntimeException("Unable to configure non-blocking socket");
...
}
SocketChannel
? - person phflack   schedule 01.11.2017numRead = socketChannelInstance.read(buffer)
. - person user8870183   schedule 01.11.2017