This shows configuring the JMS listener using Springs jms
custom namespace. The jmsMessageListener bean was loaded
by the context:component-scan and implements MessageListener.
If it didn't the jms:listener element could specify which method
should process a message from the queue. The jms:listener
specifies the destination attribute to be 'org.springbyexample.jms.test', which
matches the queue defined by the amq:queue element in the embedded ActiveMQ configuration.
The AtomicInteger is used by the listener to increment how many messages it processes, and
is also used by the unit test to confirm is received all the messages from the producer.
Excerpt from JmsMessageListenerTest-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jms="http://www.springframework.org/schema/jms"
xmlns:amq="http://activemq.apache.org/schema/core"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/jms
http://www.springframework.org/schema/jms/spring-jms.xsd
http://activemq.apache.org/schema/core
http://activemq.apache.org/schema/core/activemq-core.xsd">
<context:component-scan base-package="org.springbyexample.jms" />
...
<!-- JMS Consumer Configuration -->
<bean id="jmsConsumerConnectionFactory"
class="org.springframework.jms.connection.SingleConnectionFactory"
depends-on="broker"
p:targetConnectionFactory-ref="jmsFactory" />
<jms:listener-container container-type="default"
connection-factory="jmsConsumerConnectionFactory"
acknowledge="auto">
<jms:listener destination="org.springbyexample.jms.test" ref="jmsMessageListener" />
</jms:listener-container>
<!-- Counter for consumer to increment and test to verify count -->
<bean id="counter" class="java.util.concurrent.atomic.AtomicInteger" />
</beans>
The JmsMessageListener implements the JMS interface
MessageListener. The int property for the
message count can be retrieved before casting the message to TextMessage.
Then the message and message count are both logged.
Example 2. JmsMessageListener
@Component
public class JmsMessageListener implements MessageListener {
private static final Logger logger = LoggerFactory.getLogger(JmsMessageListener.class);
@Autowired
private AtomicInteger counter = null;
/**
* Implementation of <code>MessageListener</code>.
*/
public void onMessage(Message message) {
try {
int messageCount = message.getIntProperty(JmsMessageProducer.MESSAGE_COUNT);
if (message instanceof TextMessage) {
TextMessage tm = (TextMessage)message;
String msg = tm.getText();
logger.info("Processed message '{}'. value={}", msg, messageCount);
counter.incrementAndGet();
}
} catch (JMSException e) {
logger.error(e.getMessage(), e);
}
}
}