Not sure what you mean by "I pick from the application context", but you can always go async, by making a <channel/> a queue channel, or by adding a <dispatcher/> to a DirectChannel. Such as...
Code:
<channel id="input">
<dispatcher task-executor="exec"/>
</channel>
<task:executor id="exec" />
The thread sending a message to channel "input" essentially hands off the message to a thread managed by the <task:executor />, freeing up the main thread to send the next message; you can see this in operation here....
Code:
2012-01-19 18:14:41,212 [main] DEBUG: org.springframework.integration.channel.ExecutorChannel - preSend on channel 'input', message: [Payload=Hello world!][Headers={timestamp=1327014881212, id=3850adcc-2198-40c7-b3bc-6f39b309da2f, errorChannel=org.springframework.integration.core.MessagingTemplate$TemporaryReplyChannel@5a57e787, replyChannel=org.springframework.integration.core.MessagingTemplate$TemporaryReplyChannel@5a57e787}]
2012-01-19 18:14:41,214 [main] DEBUG: org.springframework.integration.channel.ExecutorChannel - postSend (sent=true) on channel 'input', message: [Payload=Hello world!][Headers={timestamp=1327014881212, id=3850adcc-2198-40c7-b3bc-6f39b309da2f, errorChannel=org.springframework.integration.core.MessagingTemplate$TemporaryReplyChannel@5a57e787, replyChannel=org.springframework.integration.core.MessagingTemplate$TemporaryReplyChannel@5a57e787}]
2012-01-19 18:14:41,214 [exec-1] DEBUG: org.springframework.integration.ip.tcp.TcpOutboundGateway - org.springframework.integration.ip.tcp.TcpOutboundGateway#0 received message: [Payload=Hello world!][Headers={timestamp=1327014881212, id=3850adcc-2198-40c7-b3bc-6f39b309da2f, errorChannel=org.springframework.integration.core.MessagingTemplate$TemporaryReplyChannel@5a57e787, replyChannel=org.springframework.integration.core.MessagingTemplate$TemporaryReplyChannel@5a57e787}]
2012-01-19 18:14:41,215 [exec-1] DEBUG: org.springframework.integration.ip.tcp.connection.TcpNetClientConnectionFactory - Opening new socket connection to localhost:11111