Hi, I have been working on systems in that the usage of messages queues it's almost mandatory. I will talk about messages bus or messages queues instead of JMS that it's an implementation of this.
I think that main usage of messages queues it's when you want to release the processing thread from the message handling, i.e let's say that you have a trading system that receives orders from customers, each time that you receive an order you need to parse the data, validate the fields and sending to the market if you do all this in the incoming thread you will block that thread for this customer so the user won't be able to post a lot of orders per second, so if you want to fix that, instead of do all that processing in the incoming thread you can just parse the order and put it on a queue so you release the thread and you are ready to receive a new request. Then another thread in your app (or in another app) will take the messages from the queue and process them.
You will find a lot of scenarios like this one where messages queues are the best approach.
And more these days where the idea it's to move from monolithic apps to micro services.
Hope this give you a little more details of real apps.
Regards
Mario