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.
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 Apache ActiveMQ connection
factory, or to wrap an ActiveMQSslConnectionFactory
, and so on.
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.