As long as you use <channels/> *without queues* between each endpoint, then the entire message flow will take place on the same thread. a transactional boundary can be established for a poller by adding the <transactional/> sub-element. For example, if you are using a polling inbound-channel-adapter for the JMS requests, this would be the basic idea:
Code:
<jms:inbound-channel-adapter destination="myJmsQueue" channel="requestChannel" ...>
<poller>
<interval-trigger interval="1000"/>
<transactional transaction-manager="txManager"/>
</poller>
</jms:inbound-channel-adapter>
<service-activator input-channel="requestChannel" ref="myService" method="handleMessage" output-channel="resultChannel"/>
<service-activator input-channel="resultChannel" ref="myResultService" method="handleMessage" output-channel="jmsOut"/>
<jms:outbound-channel-adapter id="jmsOut" destination="myJmsResultQueue/>
If your transactionManager bean is named "transactionManager", you can leave that attribute out.
Let me know if you have more questions. Hope that helps.
-Mark