2.8. Integration with Spring and Camel
Overview
Spring supports a useful abstraction,
JmsTemplate
, which allows you to hide some of the lower level JMS details when sending messages and so on. One thing to bear in mind about JmsTemplate
, however, is that it creates a new connection, session, and producer for every message it sends, which is very inefficient. It is implemented like this in order to work inside an EJB container, which typically provides a special JMS connection factory that supports connection pooling.
If you are not using an ESB container to manage your JMS connections, we recommend that you use the pooling JMS connection provider,
org.apache.activemq.pool.PooledConnectionFactory
, from the activemq-pool
artifact, which pools JMS resources to work efficiently with Spring's JmsTemplate
or with EJBs.
Creating a pooled connection factory
The
PooledConnectionFactory
is implemented as a wrapper class that is meant to be chained with another connection factory instance. For example, you could use a PooledConnectionFactory
instance to wrap a plain Red Hat JBoss A-MQ connection factory, or to wrap an ActiveMQSslConnectionFactory
, and so on.
Example
For example, to instantiate a pooled connection factory,
jmsFactory
, that works efficiently with the Spring JmsTemplate
instance, myJmsTemplate
, define the following bean instances in your Spring configuration file:
<!-- A pooling-based JMS provider --> <bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop"> <property name="connectionFactory"> <bean class="org.apache.activemq.ActiveMQConnectionFactory"> <property name="brokerURL"> <value>tcp://localhost:61616</value> </property> </bean> </property> </bean> <!-- Spring JMS Template --> <bean id="myJmsTemplate" class="org.springframework.jms.core.JmsTemplate"> <property name="connectionFactory"> <ref local="jmsFactory"/> </property> </bean>
In the preceding example, the pooled connection factory is chained with a plain
ActiveMQConnectionFactory
instance that opens connections to the tcp://localhost:61616
broker endpoint.