In fact, I have read these documents and followed the related configuration,
but the result is still failed. The following is the details:
1. The content of activemq-ds.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE connection-factories
PUBLIC "-//JBoss//DTD JBOSS JCA Config 1.5//EN"
"http://www.jboss.org/j2ee/dtd/jboss-ds_1_5.dtd">
<connection-factories>
<tx-connection-factory>
<jndi-name>trading/QueueConnectionFactory</jndi-name>
<xa-transaction/>
<!--<use-java-context>false</use-java-context>-->
<track-connection-by-tx/>
<rar-name>activemq-ra.rar</rar-name>
<connection-definition>javax.jms.QueueConnectionFactory</connection-definition>
<!--<ServerUrl>vm://localhost</ServerUrl>-->
<ServerUrl>tcp://10.10.135.212</ServerUrl>
<!--
<UserName>sa</UserName>
<Password></Password>
-->
<min-pool-size>1</min-pool-size>
<max-pool-size>200</max-pool-size>
<blocking-timeout-millis>30000</blocking-timeout-millis>
<idle-timeout-minutes>3</idle-timeout-minutes>
</tx-connection-factory>
<tx-connection-factory>
<jndi-name>trading/TopicConnectionFactory</jndi-name>
<xa-transaction/>
<!--<use-java-context>false</use-java-context>-->
<track-connection-by-tx/>
<rar-name>activemq-ra.rar</rar-name>
<connection-definition>javax.jms.TopicConnectionFactory</connection-definition>
<ServerUrl>tcp://10.10.135.212</ServerUrl>
<!--<ServerUrl>vm://localhost</ServerUrl>-->
<!--
<UserName>sa</UserName>
<Password></Password>
-->
<min-pool-size>1</min-pool-size>
<max-pool-size>200</max-pool-size>
<blocking-timeout-millis>30000</blocking-timeout-millis>
<idle-timeout-minutes>3</idle-timeout-minutes>
</tx-connection-factory>
<mbean code="org.jboss.resource.deployment.AdminObject"
name="activemq.queue:name=outboundQueue">
<attribute name="JNDIName">activemq/queue/outbound</attribute>
<depends
optional-attribute-name="RARName">jboss.jca:service=RARDeployment,name='activemq-ra.rar'</depends>
<attribute name="Type">javax.jms.Queue</attribute>
<attribute name="Properties">PhysicalName=queue.outbound</attribute>
</mbean>
<mbean code="org.jboss.resource.deployment.AdminObject"
name="activemq.queue:name=orderoutput">
<attribute name="JNDIName">orderoutput</attribute>
<depends
optional-attribute-name="RARName">jboss.jca:service=RARDeployment,name='activemq-ra.rar'</depends>
<attribute name="Type">javax.jms.Queue</attribute>
<attribute
name="Properties">PhysicalName=queue.orderoutput</attribute>
</mbean>
<mbean code="org.jboss.resource.deployment.AdminObject"
name="activemq.topic:name=inboundTopic">
<attribute name="JNDIName">activemq/topic/inbound</attribute>
<depends
optional-attribute-name="RARName">jboss.jca:service=RARDeployment,name='activemq-ra.rar'</depends>
<attribute name="Type">javax.jms.Topic</attribute>
<attribute name="Properties">PhysicalName=topic.inbound</attribute>
</mbean>
</connection-factories>
2. The content of ejb.jar.xml
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd"
version="2.1">
<description>Trading EJB</description>
<display-name>Application Controller Bean</display-name>
<enterprise-beans>
<!-- Session Beans -->
<session>
<description>Application Controller Bean</description>
<display-name>Application Controller</display-name>
<ejb-name>AppController</ejb-name>
<home>com.trading.platform.ejb.AppControllerHome</home>
<remote>com.trading.platform.ejb.AppController</remote>
<ejb-class>com.trading.platform.ejb.AppControllerBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
<resource-ref>
<res-ref-name>jms/QueueConnectionFactory</res-ref-name>
<res-type>javax.jms.QueueConnectionFactory</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
<message-destination-ref>
<message-destination-ref-name>jms/OrderOutputQueue</message-destination-ref-name>
<message-destination-type>javax.jms.Queue</message-destination-type>
<message-destination-usage>Produces</message-destination-usage>
<message-destination-link>OrderOutputQueue</message-destination-link>
</message-destination-ref>
</session>
</enterprise-beans>
<assembly-descriptor>
<container-transaction>
<method>
<ejb-name>AppController</ejb-name>
<method-name>handleEvent</method-name>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>
<message-destination>
<message-destination-name>OrderOutputQueue</message-destination-name>
</message-destination>
</assembly-descriptor>
</ejb-jar>
3. The content of jboss.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE jboss PUBLIC "-//JBoss//DTD JBOSS 5.0//EN"
"http://www.jboss.org/j2ee/dtd/jboss_5_0.dtd">
<jboss>
<enterprise-beans>
<session>
<ejb-name>AppController</ejb-name>
<jndi-name>ejb/AppController</jndi-name>
<resource-ref>
<res-ref-name>jms/QueueConnectionFactory</res-ref-name>
<resource-name>queuefactoryref</resource-name>
</resource-ref>
</session>
</enterprise-beans>
<assembly-descriptor>
<message-destination>
<message-destination-name>OrderOutputQueue</message-destination-name>
<jndi-name>activemq/queue/outbound</jndi-name>
</message-destination>
</assembly-descriptor>
<resource-managers>
<resource-manager>
<res-name>queuefactoryref</res-name>
<res-jndi-name>java:/trading/QueueConnectionFactory</res-jndi-name>
</resource-manager>
</resource-managers>
</jboss>
4. The source of JMS client(It is invoked in a EJB 2 stateless session
transaction context)
public void init(){
if(logger.isDebugEnabled()) logger.debug("Platform:Publisher JMS
connection init is begin..." );
this.getInitialContext();
if(logger.isDebugEnabled()) logger.debug("Platform:Publisher JMS
connection init is end..." );
}
private void getInitialContext(){
try {
Context context = new InitialContext();
QueueConnectionFactory queueConnectionFactory =
(QueueConnectionFactory)context.lookup(this.getQueueConnectionFactoryName());
System.out.println("ConnectionFactory:" +
queueConnectionFactory.getClass());
queueConn =
queueConnectionFactory.createQueueConnection();
System.out.println("Connection:" +
queueConn.getClass());
queue = (Queue)context.lookup(this.getQueueName());
queueConn.start();
System.out.println("Finished...");
} catch (NamingException e) {
if(logger.isErrorEnabled())
logger.error("NamingExcetion:" + e);
throw new SystemException("System Error", e);
} catch (JMSException e) {
if(logger.isErrorEnabled())
logger.error("JMSException:" + e);
throw new SystemException("System Error", e);
}
}
public QueueSession createQueueSession(){
QueueSession queueSession = null;
try {
queueSession = queueConn.createQueueSession(false,
QueueSession.AUTO_ACKNOWLEDGE);
} catch (JMSException e) {
if(logger.isErrorEnabled())
logger.error("JMSException:" + e);
throw new SystemException("System Error", e);
}
return queueSession;
}
public void sendMessageToQueue(IVO vo){
try {
QueueSession queueSession = this.createQueueSession();
ObjectMessage objMessage =
queueSession.createObjectMessage(vo);
QueueSender sender = queueSession.createSender(queue);
sender.send(objMessage);
queueSession.close();
} catch (JMSException e) {
if(logger.isErrorEnabled())
logger.error("JMSException:" + e);
throw new SystemException("System Error", e);
}
}
5. The source of sending message out(In a EJB transaction context)
sendMessageToQueue(order);
if(1 == 1){
System.out.println("Error222");
throw new SystemException("Error222", new
Exception(""));
}
I found the message is sent to queue even an exception will be thrown out
later, I have tried many ways, but results are all failed. It seems that the
transaction of ActiveMQ is not enlisted in the JTA transaction of JBoss. Any
suggestion about it?
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
--
View this message in context:
http://www.nabble.com/How-to-configure-ActiveMQ-to-support-XA-transaction--tp25220910p25223088.html
Sent from the ActiveMQ - User mailing list archive at Nabble.com.