Hi Oleg
The behavior of Channel#isOpen() is correct. A channel can be open
locally (or half-closed) even if it ha been closed by the remote peer.
As long as the channel is half-closed it should return -1 on all read
operations instead of throwing an I/O error.
Yes, I see.. it would have been great if FileChannel.transferFrom() returned -1 as well, without hiding that underneath the JDK layer, when actually encountered
The problem is this utterly crazy implementation of FileChannelImpl

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/sun/nio/ch/FileChannelImpl.java#607
I do not see a reasonable way of working around this insanity. The only
thing we can do is to plea to Oracle to fix it and pray they would
heed.
What if we make our LengthDelimitedEncoder try to read into the session buffer, if bytes read is found to be zero? This may not be optimal, but at least, results in the correct operation.

bytesRead = dst.transferFrom(this.channel, position, count);
                if (bytesRead == 0) {
                    bytesRead = this.buffer.fill(this.channel);
                }

regards
asankha

--
Asankha C. Perera
AdroitLogic, http://adroitlogic.org

http://esbmagic.blogspot.com




---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to