Currently using a TransactionManager with a Jms MessageDrivenChannelAdapter is rather clunky. It seems to require using DefaultMessageListenerContainer via Jms.container() and creating the channel adapter with said container. i.e.
DefaultMessageListenerContainer myContainer = Jms.container(myJmsConnectionFactory, "myQueue").transactionManager(myTransactionManager).get();
What would be ideal (as suggested by Gary Russell) would be
.configureListenerContainer(c -> c.transactionManager(tm()))