You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@activemq.apache.org by Eugene Prokopiev <pr...@stc.donpac.ru> on 2006/08/21 09:13:08 UTC

XA in standalone JMS client

Hi,

How can I use ActiveMQXA* classes in standalone JMS client? I tried to 
write this simple test:

public class AMQXATest {

	public static void main(String[] args) throws Exception {
		
		// start broker 		
		BrokerService broker = new BrokerService();
		broker.setPersistent(false);
		broker.addConnector("tcp://localhost:5000");
		broker.start();
		
		// start transaction manager
		TMService jotm = new Jotm(true, false);
		UserTransaction transaction = jotm.getUserTransaction();
		
		// start connection
		ActiveMQXAConnectionFactory connectionFactory =
			new ActiveMQXAConnectionFactory("tcp://localhost:5000");
		XAConnection connection = connectionFactory.createXAConnection();
		XASession session = connection.createXASession();
         Destination destination = session.createQueue("messages.input");
         MessageProducer producer = session.createProducer(destination);

         // send message
         TextMessage message = session.createTextMessage("Test Message 
String");
         transaction.begin();
         producer.send(message);
         transaction.commit();
         System.out.println("sent message : "+message.getJMSMessageID());

         // close connection
         session.close();
         connection.close();		
	}

}

On running it I got:

INFO  BrokerService - ActiveMQ null JMS Message Broker (localhost) is 
starting
INFO  BrokerService - For help or more information please see: 
http://incubator.apache.org/activemq/
INFO  TransportServerThreadSupport - Listening for connections at: 
tcp://prokopiev.stc.donpac.ru:5000
INFO  TransportConnector - Connector tcp://prokopiev.stc.donpac.ru:5000 
Started
INFO  BrokerService - ActiveMQ JMS Message Broker (localhost, 
ID:prokopiev.stc.donpac.ru-39870-1156143935533-0:0) started
INFO  jotm - JOTM started with a local transaction factory which is not 
bound.
INFO  jotm - CAROL initialization
INFO  ConfigurationRepository - No protocols were defined for property 
'carol.protocols', trying with default protocol = 'jrmp'.
INFO  jta - JOTM 2.0.10
INFO  ManagementContext - JMX consoles can connect to 
service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi
Exception in thread "main" javax.jms.JMSException: Session's XAResource 
has not been enlisted in a distributed transaction.
	at 
org.apache.activemq.ActiveMQXASession.doStartTransaction(ActiveMQXASession.java:109)
	at org.apache.activemq.ActiveMQSession.send(ActiveMQSession.java:1502)
	at 
org.apache.activemq.ActiveMQMessageProducer.send(ActiveMQMessageProducer.java:462)
	at 
org.apache.activemq.ActiveMQMessageProducer.send(ActiveMQMessageProducer.java:356)
	at jta.AMQXATest.main(AMQXATest.java:40)

How can I enlist Session's XAResource in a distributed transaction?

--
Thanks,
Eugene Prokopiev


Re: XA in standalone JMS client

Posted by Eugene Prokopiev <pr...@stc.donpac.ru>.
> You need to enlist resources with JTA. I'd suggest reading the JTA
> javadoc and specification.
> 
> http://java.sun.com/j2ee/1.4/docs/api/javax/transaction/Transaction.html

Thanks. This code works as I need:

public class AMQXATest {

	public static void main(String[] args) throws Exception {
		
		// start broker 		
		BrokerService broker = new BrokerService();
		broker.setPersistent(false);
		broker.addConnector("tcp://localhost:5000");
		broker.start();
		
		// start transaction manager
		TMService jotm = new Jotm(true, false);
		UserTransaction transaction = jotm.getUserTransaction();
		TransactionManager transactionManager = jotm.getTransactionManager();
		
		// start connection
		ActiveMQXAConnectionFactory connectionFactory =
			new ActiveMQXAConnectionFactory("tcp://localhost:5000");
		XAConnection connection = connectionFactory.createXAConnection();
		XASession session = connection.createXASession();
		Destination destination = session.createQueue("messages.input");
         MessageProducer producer = session.createProducer(destination);

         // send message
         TextMessage message = session.createTextMessage("Test Message 
String");
         transaction.begin();
 
transactionManager.getTransaction().enlistResource(session.getXAResource());
         System.out.println(transactionManager.getTransaction());
         producer.send(message);
         transaction.commit();
         System.out.println("sent message : "+message.getJMSMessageID());

         // close connection
         session.close();
         connection.close();		
	}

}

Main disadvantage is using UserTransaction and TransactionManager while 
sending message because I can't start transaction with 
TransactionManager and can't enlist XASession with UserTransaction.

How can I refactor this code to use only UserTransaction or 
TransactionManager while sending message?

--
Thanks,
Eugene Prokopiev


Re: XA in standalone JMS client

Posted by James Strachan <ja...@gmail.com>.
You need to enlist resources with JTA. I'd suggest reading the JTA
javadoc and specification.

http://java.sun.com/j2ee/1.4/docs/api/javax/transaction/Transaction.html

On 8/21/06, Eugene Prokopiev <pr...@stc.donpac.ru> wrote:
> Hi,
>
> How can I use ActiveMQXA* classes in standalone JMS client? I tried to
> write this simple test:
>
> public class AMQXATest {
>
>         public static void main(String[] args) throws Exception {
>
>                 // start broker
>                 BrokerService broker = new BrokerService();
>                 broker.setPersistent(false);
>                 broker.addConnector("tcp://localhost:5000");
>                 broker.start();
>
>                 // start transaction manager
>                 TMService jotm = new Jotm(true, false);
>                 UserTransaction transaction = jotm.getUserTransaction();
>
>                 // start connection
>                 ActiveMQXAConnectionFactory connectionFactory =
>                         new ActiveMQXAConnectionFactory("tcp://localhost:5000");
>                 XAConnection connection = connectionFactory.createXAConnection();
>                 XASession session = connection.createXASession();
>          Destination destination = session.createQueue("messages.input");
>          MessageProducer producer = session.createProducer(destination);
>
>          // send message
>          TextMessage message = session.createTextMessage("Test Message
> String");
>          transaction.begin();
>          producer.send(message);
>          transaction.commit();
>          System.out.println("sent message : "+message.getJMSMessageID());
>
>          // close connection
>          session.close();
>          connection.close();
>         }
>
> }
>
> On running it I got:
>
> INFO  BrokerService - ActiveMQ null JMS Message Broker (localhost) is
> starting
> INFO  BrokerService - For help or more information please see:
> http://incubator.apache.org/activemq/
> INFO  TransportServerThreadSupport - Listening for connections at:
> tcp://prokopiev.stc.donpac.ru:5000
> INFO  TransportConnector - Connector tcp://prokopiev.stc.donpac.ru:5000
> Started
> INFO  BrokerService - ActiveMQ JMS Message Broker (localhost,
> ID:prokopiev.stc.donpac.ru-39870-1156143935533-0:0) started
> INFO  jotm - JOTM started with a local transaction factory which is not
> bound.
> INFO  jotm - CAROL initialization
> INFO  ConfigurationRepository - No protocols were defined for property
> 'carol.protocols', trying with default protocol = 'jrmp'.
> INFO  jta - JOTM 2.0.10
> INFO  ManagementContext - JMX consoles can connect to
> service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi
> Exception in thread "main" javax.jms.JMSException: Session's XAResource
> has not been enlisted in a distributed transaction.
>         at
> org.apache.activemq.ActiveMQXASession.doStartTransaction(ActiveMQXASession.java:109)
>         at org.apache.activemq.ActiveMQSession.send(ActiveMQSession.java:1502)
>         at
> org.apache.activemq.ActiveMQMessageProducer.send(ActiveMQMessageProducer.java:462)
>         at
> org.apache.activemq.ActiveMQMessageProducer.send(ActiveMQMessageProducer.java:356)
>         at jta.AMQXATest.main(AMQXATest.java:40)
>
> How can I enlist Session's XAResource in a distributed transaction?
>
> --
> Thanks,
> Eugene Prokopiev
>
>


-- 

James
-------
http://radio.weblogs.com/0112098/