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.