Handling JMS using standard JMS API is a tedious task - you need to create a lot of boilerplate code.
Spring provides an abstraction layer that eases this pain.
In the following example I'm using ActiveMQ (which needs to be started before running any of the code below) but Spring works with other major JMS implementations as well.
In order to send a JMS message we can use JMS template. Here's our sender that's using it:
Spring beans needs to be configured in a context. Let's define Spring configuration in Java code:
JMS template must have a connection factory with a broker url and a destination (in our case it's a queue).
The XML configuration equivalent would look like:
Java configuration provides not only compile-time checking but in my opinion it is more straightforward and easier to control.
Unfortunately we can't escape XML completely, we need to turn on component scanning so that Spring will read configuration from classes in our package:
The example code that would run the sender:
Apart from the sender we can also create the receiver. One of the solutions is to make him asynchronous by implementing MessageListener interface.
The Spring config looks as follows:
Our receiver is set in the message listener container with the connection factory and the destination.
Receiver is missing the same XML configuration as sender, and the running code is analogical.
Here's the list of maven dependencies: