| tags |
|
||
|---|---|---|---|
| projects |
|
This guide walks you through the process of publishing and subscribing to messages using a JMS broker.
You’ll build an application that uses Spring’s JmsTemplate to post a single message and subscribes to it with a POJO using MessageListenerAdapter.
Spring provides the means to publish messages to any POJO.
src/main/java/hello/Receiver.java
link:complete/src/main/java/hello/Receiver.java[role=include]This is also known as a message driven POJO. As you can see in the code above, there is no need to implement any particular interface or for the method to have any particular name.
Next, wire up a sender and a receiver.
src/main/java/hello/Application.java
link:complete/src/main/java/hello/Application.java[role=include]To wrap the Receiver you coded earlier, use MessageListenerAdapter. Then use the setDefaultListenerMethod to configure which method to invoke when a message comes in. Thus you avoid implementing any JMS or broker-specific interfaces.
The SimpleMessageListenerContainer class is an asynchronous message receiver. It uses the MessageListenerAdapter and the ConnectionFactory and is fired up when the application context starts. Another parameter is the queue name set in mailboxDestination.
Spring provides a convenient template class called JmsTemplate. JmsTemplate makes it very simple to send messages to a JMS message queue. In the main runner method, after starting things up, you create a MessageCreator and use it from jmsTemplate to send a message.
Two beans that you don’t see defined are JmsTemplate and ActiveMQConnectionFactory. These are created automatically by Spring Boot. In this case, the ActiveMQ broker runs embedded.
By default, Spring Boot creates a JmsTemplate configured to transmit to queues by having pubSubDomain set to false. The SimpleMessageListenerContainer is also configured the same.
To override, set spring.jms.isPubSubDomain=true via Boot’s property settings (either inside application.propertes or by environment variable). Then make sure the receiving container
has the same setting.
|
Note
|
Spring’s JmsTemplate can receive messages directly through its receive method, but that only works synchronously, meaning it will block. That’s why Spring recommends that you use a listener container such as SimpleMessageListenerContainer with a cache-based connection factory, so you can consume messages asynchronously and with maximum connection efficiency.
|
When it runs, buried amidst all the logging, you should see these messages:
Sending a new message. Received <ping!>