spring-projects/spring-integration — pull request #1180 by garyrussell (2014-06-20 16:14:09+00:00)
Title: INT-3433 NIO Thread Starvation with Fixed Pool

Replaces #1171

Squashed @john2A 's commits into one; squashed my delayed IO commits; added doc changes.

Artem - after review, please squash my 2 commits and leave John's separate (adding 2 commits to master); thanks.

JIRA: https://jira.spring.io/browse/INT-3433

INT-3433 added the test-case

INT-3433 Delay Failed IOs

JIRA: https://jira.spring.io/browse/INT-3433`

If a read fails due to insufficient threads, delay the read
for (default 100ms) - do not re-enable OP_READ until that
time has elapsed. Avoids spinning the CPU.

INT-3433 More Polishing

If the assembler couldn't execute a new assembler after assembling
the current message (when it detected there is more data), in the
finally block it would "continue" only if the socket was still
open.

The test case closes the socket after sending 4 messages so when
this condition occurred, the assembler failed to continue and
data was left in the buffer.

Remove the `isOpen()` check in the finally block and always continue
if there's not another assembler running and there's data available.

INT-3433 More Polishing

We can still get starvation if the selector is in a long
wait (in select()) when a read is delayed.

Whenever a read is delayed, wake the selector so its next
select will use the readDelay timeout.

INT-3433 Reference Docs

Also remove Thread.yield().