You already know about method calls. What if the object that you want to invoke the method on is on a different computer? You use RMI to send the call from one computer (client) to the other (server). The client will wait (or “block”) until the result comes back from the server. This is called synchronous operation.
JMS is different: it lets one computer send a message to another – like email. The first one doesn’t have to wait for a response: it can keep doing whatever work it wants. There may not even be a response. The two computer systems don’t necessarily work exactly in step, so this is called asynchronous.
Another way of thinking about the difference: RMI is like making a phone call, and JMS is like sending a text message.
RMI is a little older than JMS, but that’s not really relevant. The two concepts are much much older than java.
There’s not much difference in the complexity. I think that you should try doing a tutorial on each one. RMI and JMS
If you’re starting a project from scratch, and you’re not sure which one to use, then probably the synchronous/asynchronous issue is the best decision factor. If you’re working on an existing system, it’s probably best not to introduce too many new technologies. So if they’re already using one, then I’d suggest it’s probably best to stick with that one.