Tuesday, December 30, 2008

Using jencks to pool JMS connections

Using Jencks
Jencks is a lightweight JCA container which is easy to deploy inside Spring to provide Message Driven POJOs. In addition Jencks supports inbound and outbound messaging using APIs like JMS, JAX-RPC, JBI and JCA CCI as well as providing an XA based pooling mechanism for JDBC.

Jencks by default reuses the Geronimo JCA connector, WorkManager and TransactionManager - though there are no fixed runtime dependencies on Geronimo so you should be able to use Jencks with JOTM and Jonas too - though we recommend the Geronimo implementations as they are heavily tested and support full XA recovery.

Here is the sample configuration.
<bean id="jmsResourceAdapter" class="org.apache.activemq.ra.ActiveMQResourceAdapter">
<property name="serverUrl" value="tcp://localhost:61616" />
</bean>

<!-- ###### Transaction manager ###### -->
<bean id="transactionManager" class="org.jencks.factory.TransactionManagerFactoryBean" />

<!-- ###### Connection Manager ###### -->
<bean id="connectionManager" class="org.jencks.factory.ConnectionManagerFactoryBean">
<property name="transactionManager" ref="transactionManager" />
<property name="poolMaxSize" value="20" />
</bean>

<!-- ###### JMS Managed Connection Factory ###### -->
<bean id="jmsManagedConnectionFactory" class="org.apache.activemq.ra.ActiveMQManagedConnectionFactory">
<property name="resourceAdapter" ref="jmsResourceAdapter" />
</bean>

<bean id="connectionFactory" class="org.jencks.factory.ConnectionFactoryFactoryBean">
<property name="managedConnectionFactory" ref="jmsManagedConnectionFactory" />
<property name="connectionManager" ref="connectionManager" />
</bean>

<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="connectionFactory" />
<property name="defaultDestination" ref="mqDestination" />
<property name="messageConverter" ref="jmsMessageConverter" />
</bean>

We also need add dependency in pom.xml
<dependency>
<groupId>org.jencks</groupId>
<artifactId>jencks</artifactId>
<version>2.1</version>
</dependency>
<dependency>
<groupId>org.jencks</groupId>
<artifactId>jencks-amqpool</artifactId>
<version>2.1</version>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-ra</artifactId>
<version>5.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.geronimo.specs</groupId>
<artifactId>geronimo-j2ee-connector_1.5_spec</artifactId>
<version>1.1</version>
</dependency>



You can also use PooledConnectionFactory from activeMQ
Sample: here is the orginal spring configuration without pooling.


<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="tcp://localhost:61616" />
</bean>
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="connectionFactory" />
<property name="defaultDestination" ref="mqDestination" />
<property name="messageConverter" ref="jmsMessageConverter" />
</bean>

We only need replace the "org.apache.activemq.ActiveMQConnectionFactory" with "org.apache.activemq.pool.PooledConnectionFactory"

<bean id="connectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory">
<constructor-arg value="tcp://localhost:61616" />
<property name="maxConnections" value="20" />
</bean>


The weak point is that it is activemq specific. Once the jms provider is changed, this setting should also be changed.

No comments:

Post a Comment