You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@activemq.apache.org by Daniel Gradecak <da...@gradecak.com> on 2007/04/23 23:05:38 UTC

XATransaction

Hi,

I would like to make an ActiveMQ participate in a XA Transaction. I have 
speial needs is that i may suspend a transaction and resume it in 
antoher thread. I am using spring for configuring all that together
and its JmsTmplate. I saw 
http://activemq.apache.org/jms-and-jdbc-operations-in-one-transaction.html 
and http://jencks.org/Outbound+JMS , that seems fine to me. But I 
thought I could use JTOM as TM.
So maybe it is not the right place to ask but I do not know where else :(

I would like to know if there is a better solution to use XA with 
ActiveMQ because when I do a massive (never doing commit, just for test) 
rollback in my "transaction resuming threads" after one hour and a half
of executing those threads (I am using Executors with a pool of 20 
threads) I just receive java heap space. As I was using jencks/geronimo 
I tried the same with JTOM but the same happened. I am also using the 
new AMQPool from Jencks, because i do not know how else i could pool xa 
connections for activemq. I also saw an old thread speaking about 
http://issues.apache.org/activemq/browse/AMQ-303 but it seems it was 
moved to Jencks.

So please guys, is it better to use Jencks or JTOM?

Here is my sample config ...

    <bean id="jmsResourceAdapter" 
class="org.apache.activemq.ra.ActiveMQResourceAdapter">
        <property 
name="serverUrl"><value>${jms.brokerUrl}</value></property>
      </bean>

    <bean id="transactionManager" 
class="org.jencks.factory.TransactionManagerFactoryBean">
        <property 
name="defaultTransactionTimeoutSeconds"><value>${jms.transaction.timeout}</value></property>
    </bean>
   

    <bean id="connectionFactory" 
class="org.jencks.amqpool.JcaPooledConnectionFactory">
        
<constructor-arg><value>${jms.brokerUrl}</value></constructor-arg>   
        <property name="transactionManager" ref="transactionManager"/>
        <property 
name="maxConnections"><value>${jms.pool.maxConnections}</value></property>
    </bean>
   
    <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
        <property name="connectionFactory" ref="connectionFactory"/>
        <property 
name="receiveTimeout"><value>${jms.receive.timeout}</value></property>
    </bean>

*And the java suspend transaction code ...*

        TextMessage m = (TextMessage)template.receive(queueName);
                if( m != null){
                   
                    tx = tm.suspend();
                   
                    threadDisptacher.submit(new TxThread(tm, tx, m));
                   
                } else{
                    System.out.println("TIMEOUT : 
"+Thread.currentThread().getId());
                    tm.rollback();
                }

*And the TxThread when it starts it does ...*

           try {           
            tm.resume(tx);
           
            System.out.println("> SLEEP ... 
"+Thread.currentThread().getId());
            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
            }
            System.out.println("> SLEEP DONE 
"+Thread.currentThread().getId());
           
            System.out.println(m);
           
            tm.rollback();
        } catch (Throwable e) {               
            e.printStackTrace();
            try {
                tm.rollback();
            } catch (Throwable e1) {
                e1.printStackTrace();
            }
        }

Sorry for this intrusion.

Kindly,
Daniel