What you want is to use transactions and not rely on acknowlegements. Then you can start a transaction upon read, then commit the transaction when you sent the response message. If some bad things happends, the transaction rolls back and some node consuming messages have to redo the procedure.
The DefaultMessageListenerContainer in Spring can be setup to support transactions. The javadoc is pretty good and provides links to other sources of information regarding spring and transactions (itself, a rather large subject). In a nutshell, if you setup session transacted, your transaction will roll back if there is an Exception thrown and commit when your onMessage method returns.