By definition, all the channels "within" a gateway are direct channels; the thread entering the first <chain/> has to complete all the work in that chain. It will block until the gateway returns, regardless any multi-threading downstream of the gateway. Each of the splits runs on the same thread. The same would occur outside of a chain, if the splitter and gateway were connected by an explicit DirectChannel.
You need to add some asynchrony between the splitter and gateway in order to get parallelism there; this can't be done in a chain. You can either use a <queue/> channel between the splitter and gateway, or use a direct channel with a dispatcher that has a <task-executor/>.
See the reference manual for more info, especially transactional considerations.
Gary P. Russell
Spring Integration Team
SpringSource, a division of VMware