[ https://issues.apache.org/activemq/browse/AMQ-303?page=all ]

Hiram Chirino reassigned AMQ-303:
---------------------------------

    Assign To: james strachan

James, perhaps we should close this issue out and open one against jencks?

> Pooled XAConnectionFactory for use with Spring
> ----------------------------------------------
>
>          Key: AMQ-303
>          URL: https://issues.apache.org/activemq/browse/AMQ-303
>      Project: ActiveMQ
>         Type: Improvement

>   Components: Connector, JMS client, JCA Container
>  Environment: ActiveMQ 3
>     Reporter: Andy DePue
>     Assignee: james strachan
>     Priority: Minor
>  Attachments: PooledSpringXAConnectionFactory_7_14_05.zip
>
>
> Work is currently underway to provide a JCA Container implementation for 
> Spring, which would allow fully transaction aware usage of ActiveMQ in 
> Spring.  Current Spring JCA Container implementations work well for 
> consumers, but are not quite mature for producers.  I've thrown together (as 
> in, just a couple hours of work) an implementation of XAConnectionFactory 
> that is both pooled and automatically detects and participates in surrounding 
> JTA transactions.  There are some caveats to this, however:
> 1. This is considered a temporary solution until Spring JCA Container 
> implementations have matured to the point where one can access pooled 
> producers that automatically participate in the (optional) surrounding JTA 
> transaction, even if the transaction was started by a 3rd party (as opposed 
> to being started by ActiveMQ in response to consuming a message).
> 2. This was thrown together by copying out ActiveMQ's PooledConnectionFactory 
> code and modifying as needed.  Because of this, there is much code 
> duplication between PooledConnectionFactory and 
> PooledSpringXAConnectionFactory.  Also, the code ends up being ugly. :)
> 3. This implementation depends on both JTA and Spring.  It requires JTA in 
> order to properly enlist and handle XA connections/sessions/etc, and it 
> requires Spring in order to manage XASession resources associated with the 
> current transaction.
> 4. We are still in the process of testing this code.  We are moving our 
> current code base to Spring 1.2.2 as we need some of the transaction bug 
> fixes made in 1.2.2.  Until we are fully ported, we will not be able to fully 
> test this code.  If we run into problems/bugs, we will post updates to this 
> JIRA issue.
> With all that out of the way, usage is very similar to 
> PooledConnectionFactory.  First, I'll comment on usage, and then show a 
> sample Spring configuration.
> As far as usage is concerned, you must not hold onto sessions and/or 
> producers for long periods of time, especially across transaction boundaries. 
>  In other words, do not write code that opens a session and then leaves it 
> open for the duration of your application.  Instead, your code should do this 
> every time it needs to produce:
> 1. Open a new connection: connectionFactory.createConnection().
> 2. Create a new session: connection.createSessions(...)
> 3. Create a producer: session.createProducer(...)
> 4. Produce messages
> 5. close producer, close session, close connection.
> This pattern may seem heavyweight, but because you are using 
> PooledSpringXAConnectionFactory, it is actually quite light and efficient.  
> The following will hold true if you use this pattern:
> 1. You will be using pooled connections, sessions, and producers - so you 
> will be avoiding the cost of opening/creating them every time, even though 
> you are calling "create" and "close" methods.
> 2. These sessions will automatically participate in any surrounding JTA 
> transaction.
> 3. All these objects will be properly managed for thread safety.
> 4. If there is a surrounding JTA transaction, then for each thread, the same 
> actual XASession will be used for the remainder of the transaction.
> Finally, here is an example Spring configuration:
>       <!-- This bean automatically handles pooling and transaction management 
> -->
>       <bean id="jmsConnectionFactory" 
> class="com.marathon.jms.PooledSpringXAConnectionFactory">
>         <property name="connectionFactory">
>           <!-- Actual transaction aware connection factory. -->
>           <bean class="org.activemq.ActiveMQXAConnectionFactory">
>             <property name="brokerURL"><value>... broker URL goes here 
> ...</value></property>
>           </bean>
>         </property>
>         <property name="jtaTransactionManager" ref="transactionManager"/>
>       </bean>
> Note that PooledSpringXAConnectionFactory needs access to a JTA 
> TransactionManager, and there are two ways to provide it.  If you have 
> exposed the actual JTA javax.transaction.TransactionManager as a bean in your 
> Spring config, then you would set the "transactionManager" property:
>   <property name="transactionManager" ref="beanNameOfTransactionManager"/>
> If you have exposed a Spring 
> org.springframework.transaction.jta.JtaTransactionManager in your config, 
> then you could set the "jtaTransactionManager" property:
>   <property name="jtaTransactionManager" 
> ref="beanNameOfSpringJtaTransactionManager"/>
> Either way will allow PooledSpringXAConnectionFactory to get access to the 
> JTA TransactionManager.  You only need to set one of these properties.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   https://issues.apache.org/activemq/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira

Reply via email to