The InputStream use case is easy.
Simply use an <inbound-channel-adapter/>, set the poller to an unlimited messages-per-poll; the poller will keep calling the method and you can pull individual messages from the stream; when the stream is consumed, return null and the poller will sleep until the next trigger.
For the original use case (one message becomes multiple messages), as long as you can use asynchronous threads, have the service activator invoke a method that has a void return and put the message in a BlockingQueue. Then, on the producer side, use an <inbound-channel-adapter/> to poll another method that reads from the queue; just like the InputStream case; the method invoked by the poller can return whatever you want.
If you need it all to run on the same thread, it would be a little more difficult because, by definition (according to your requirements), you don't have all the data when you enter the service, but you could still do it by staging the data, return null until all the data is available and then send a collection of messages that can be split later.
Gary P. Russell
Spring Integration Team
SpringSource, a division of VMware