You use JMS when you want to process things asynchronously. You can configure it as fault-tolerant as you want, so if the message operation failed, the message is not lost. Your requirements are pretty vague, but JMS seems like a good solution here.
Spring , JMS.