Hi,
I use this context.xml:
<beans>
<bean id="broker" class="org.apache.activemq.broker.BrokerService"
init-method="start" destroy-method="stop">
<property name="persistent" value="false"/>
<property name="transportConnectorURIs">
<list>
<value>tcp://localhost:5000</value>
</list>
</property>
</bean>
<bean id="transactionContextManager"
class="org.jencks.factory.TransactionContextManagerFactoryBean"/>
<bean id="userTransaction"
class="org.jencks.factory.GeronimoTransactionManagerFactoryBean"/>
<bean id="jtaTransactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="userTransaction" ref="userTransaction" />
</bean>
<bean id="jmsResourceAdapter"
class="org.apache.activemq.ra.ActiveMQResourceAdapter">
<property name="serverUrl" value="tcp://localhost:5000"/>
</bean>
<bean id="jencks" class="org.jencks.JCAContainer">
<property name="bootstrapContext">
<bean
class="org.jencks.factory.BootstrapContextFactoryBean">
<property name="threadPoolSize" value="25"/>
</bean>
</property>
<property name="resourceAdapter" ref="jmsResourceAdapter"/>
</bean>
<bean id="inboundConnector" class="org.jencks.JCAConnector">
<property name="jcaContainer" ref="jencks" />
<property name="activationSpec">
<bean
class="org.apache.activemq.ra.ActiveMQActivationSpec">
<property name="destination"
value="messages.input"/>
<property name="destinationType"
value="javax.jms.Queue"/>
</bean>
</property>
<property name="transactionManager" ref="userTransaction"/>
<property name="ref" value="echoBean"/>
</bean>
<bean id="connectionManager"
class="org.jencks.factory.ConnectionManagerFactoryBean">
<property name="transactionSupport">
<bean
class="org.jencks.factory.XATransactionFactoryBean">
<property name="useTransactionCaching"
value="true"/>
<property name="useThreadCaching"
value="false"/>
</bean>
</property>
<property name="poolingSupport">
<bean class="org.jencks.factory.SinglePoolFactoryBean">
<property name="maxSize" value="2"/>
<property name="minSize" value="1"/>
<property name="blockingTimeoutMilliseconds"
value="60"/>
<property name="idleTimeoutMinutes" value="60"/>
<property name="matchOne" value="true"/>
<property name="matchAll" value="true"/>
<property name="selectOneAssumeMatch"
value="true"/>
</bean>
</property>
</bean>
<bean id="echoBean" class="transaction.test.EchoBean">
<property name="jdbcTemplate">
<bean
class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource">
<!--
<bean
class="org.postgresql.xa.PGXADataSource">
<property name="serverName"
value="ats-manager"/>
<property name="databaseName"
value="activemq"/>
<property name="user"
value="activemq"/>
</bean>
-->
<bean
class="org.springframework.jca.support.LocalConnectionFactoryBean">
<property
name="managedConnectionFactory">
<bean
class="org.jencks.tranql.XAPoolDataSourceMCF">
<property name="driverName"
value="org.postgresql.Driver"/>
<property name="url"
value="jdbc:postgresql://ats-manager/activemq"/>
<property name="user"
value="activemq"/>
</bean>
</property>
<property name="connectionManager"
ref="connectionManager"/>
</bean>
</property>
</bean>
</property>
<property name="jmsTemplate">
<bean class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory">
<bean
class="org.springframework.jca.support.LocalConnectionFactoryBean">
<property
name="managedConnectionFactory">
<bean
class="org.apache.activemq.ra.ActiveMQManagedConnectionFactory">
<property
name="resourceAdapter" ref="jmsResourceAdapter"/>
</bean>
</property>
</bean>
</property>
</bean>
</property>
<property name="destination">
<bean class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg value="messages.output"/>
</bean>
</property>
</bean>
</beans>
EchoBean is:
public class EchoBean implements MessageListener {
private Log log = LogFactory.getLog(getClass());
private JdbcTemplate jdbcTemplate;
private JmsTemplate jmsTemplate;
private Destination destination;
public void setDestination(Destination destination) {
this.destination = destination;
}
public void setJmsTemplate(JmsTemplate template) {
this.jmsTemplate = template;
}
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public void onMessage(final Message message) {
log.debug("MESSAGE : "+message);
if (message instanceof TextMessage) {
jmsTemplate.send(destination, new MessageCreator() {
public Message createMessage(Session session)
throws JMSException {
return
session.createTextMessage(((TextMessage)message).getText());
}
});
try {
jdbcTemplate.execute(
"insert into t2
values('"+((TextMessage)message).getText()+"')");
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
On starting context and put message to messages.input with external
application I got:
DEBUG org.jencks.XAEndpoint
Transaction started and resource enlisted
DEBUG transaction.test.EchoBean
MESSAGE : ActiveMQTextMessage {commandId = 5, responseRequired =
true, messageId =
ID:prokopiev.stc.donpac.ru-52879-1154443542693-0:0:1:1:1,
originalDestination = null, originalTransactionId = null, producerId =
ID:prokopiev.stc.donpac.ru-52879-1154443542693-0:0:1:1, destination =
queue://messages.input, transactionId = null, expiration = 0, timestamp
= 1154443543118, arrival = 0, correlationId = null, replyTo = null,
persistent = true, type = null, priority = 4, groupID = null,
groupSequence = 0, targetConsumerId = null, compressed = false, userID =
null, content = [EMAIL PROTECTED],
marshalledProperties = null, dataStructure = null, redeliveryCounter =
0, size = 0, properties = null, readOnlyProperties = true, readOnlyBody
= true, text = null}
DEBUG org.apache.activemq.ActiveMQSession
Sending message: ActiveMQTextMessage {commandId = 0,
responseRequired = false, messageId =
ID:prokopiev.stc.donpac.ru-52866-1154443516464-3:1:1:1:1,
originalDestination = null, originalTransactionId = null, producerId =
ID:prokopiev.stc.donpac.ru-52866-1154443516464-3:1:1:1, destination =
queue://messages.output, transactionId = null, expiration = 0, timestamp
= 1154443543423, arrival = 0, correlationId = null, replyTo = null,
persistent = true, type = null, priority = 4, groupID = null,
groupSequence = 0, targetConsumerId = null, compressed = false, userID =
null, content = null, marshalledProperties = null, dataStructure = null,
redeliveryCounter = 0, size = 0, properties = null, readOnlyProperties =
true, readOnlyBody = true, text = Test Message String}
INFO org.springframework.beans.factory.xml.XmlBeanDefinitionReader
Loading XML bean definitions from class path resource
[org/springframework/jdbc/support/sql-error-codes.xml]
INFO org.springframework.jdbc.support.SQLErrorCodesFactory
SQLErrorCodes loaded: [DB2, HSQL, MS-SQL, MySQL, Oracle, Informix,
PostgreSQL, Sybase]
org.springframework.jdbc.BadSqlGrammarException: StatementCallback; bad
SQL grammar [insert into t2 values('Test Message String')]; nested
exception is org.postgresql.util.PSQLException: ERROR: relation "t2"
does not existDEBUG org.apache.activemq.TransactionContext
End:
[globalId=100000005748415420444f2057452043414c4c2049543f0000000000000000000000000000000000000,branchId=100000005748415420444f2057452043414c4c2049543f0000000000000000000000000000000000000]
DEBUG org.apache.activemq.TransactionContext
Ended XA transaction:
XID:1197822575:01000000000000005748415420444f2057452043414c4c2049543f00000000000000000000000000000000000000000000000000000000000000000000000000:01000000000000005748415420444f2057452043414c4c2049543f00000000000000000000000000000000000000000000000000000000000000000000000000
DEBUG org.apache.activemq.TransactionContext
End:
[globalId=100000005748415420444f2057452043414c4c2049543f0000000000000000000000000000000000000,branchId=100000005748415420444f2057452043414c4c2049543f0000000000000000000000000000000000000]
DEBUG org.apache.activemq.TransactionContext
Rollback:
[globalId=100000005748415420444f2057452043414c4c2049543f0000000000000000000000000000000000000,branchId=100000005748415420444f2057452043414c4c2049543f0000000000000000000000000000000000000]
DEBUG org.apache.activemq.transaction.XATransaction
XA Transaction rollback:
XID:1197822575:01000000000000005748415420444f2057452043414c4c2049543f00000000000000000000000000000000000000000000000000000000000000000000000000:01000000000000005748415420444f2057452043414c4c2049543f00000000000000000000000000000000000000000000000000000000000000000000000000
Caused by: org.postgresql.util.PSQLException: ERROR: relation "t2" does
not exist
at
org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1512)
at
org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1297)
at
org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:188)
at
org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:437)
at
org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:339)
at
org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:331)
at org.enhydra.jdbc.core.CoreStatement.execute(CoreStatement.java:87)
at
org.tranql.connector.jdbc.StatementHandle.execute(StatementHandle.java:121)
at
org.springframework.jdbc.core.JdbcTemplate$1ExecuteStatementCallback.doInStatement(JdbcTemplate.java:309)
at
org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:283)
at
org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:316)
at transaction.test.EchoBean.onMessage(EchoBean.java:45)
at org.jencks.XAEndpoint.onMessage(XAEndpoint.java:126)
at
org.apache.activemq.ra.MessageEndpointProxy$MessageEndpointAlive.onMessage(MessageEndpointProxy.java:120)
at
org.apache.activemq.ra.MessageEndpointProxy.onMessage(MessageEndpointProxy.java:60)
at org.apache.activemq.ActiveMQSession.run(ActiveMQSession.java:690)
at
org.apache.activemq.ra.ServerSessionImpl.run(ServerSessionImpl.java:164)
at
org.apache.geronimo.connector.work.WorkerContext.run(WorkerContext.java:291)
at EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run(Unknown
Source)
at java.lang.Thread.run(Thread.java:595)
ERROR Transaction
Unexpected exception rolling back
[EMAIL PROTECTED];
continuing with rollback
javax.transaction.xa.XAException
at
org.enhydra.jdbc.standard.StandardXADataSource.getConnection(StandardXADataSource.java:444)
at
org.enhydra.jdbc.standard.StandardXAConnection.rollback(StandardXAConnection.java:547)
at
org.apache.geronimo.transaction.manager.WrapperNamedXAResource.rollback(WrapperNamedXAResource.java:78)
at
org.apache.geronimo.transaction.manager.TransactionImpl.rollbackResources(TransactionImpl.java:542)
at
org.apache.geronimo.transaction.manager.TransactionImpl.commit(TransactionImpl.java:233)
at
org.apache.geronimo.transaction.manager.TransactionManagerImpl.commit(TransactionManagerImpl.java:143)
at
org.apache.geronimo.transaction.context.InheritableTransactionContext.complete(InheritableTransactionContext.java:196)
at
org.apache.geronimo.transaction.context.InheritableTransactionContext.commit(InheritableTransactionContext.java:146)
at
org.apache.geronimo.transaction.context.GeronimoTransactionManager.commit(GeronimoTransactionManager.java:81)
at
org.apache.geronimo.transaction.context.GeronimoTransactionDelegate.commit(GeronimoTransactionDelegate.java:51)
at org.jencks.XAEndpoint.afterDelivery(XAEndpoint.java:103)
at
org.apache.activemq.ra.MessageEndpointProxy$MessageEndpointAlive.afterDelivery(MessageEndpointProxy.java:125)
at
org.apache.activemq.ra.MessageEndpointProxy.afterDelivery(MessageEndpointProxy.java:64)
at
org.apache.activemq.ra.ServerSessionImpl.afterDelivery(ServerSessionImpl.java:215)
at org.apache.activemq.ActiveMQSession.run(ActiveMQSession.java:744)
at
org.apache.activemq.ra.ServerSessionImpl.run(ServerSessionImpl.java:164)
at
org.apache.geronimo.connector.work.WorkerContext.run(WorkerContext.java:291)
at EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run(Unknown
Source)
at java.lang.Thread.run(Thread.java:595)
ERROR org.apache.geronimo.transaction.context.AbstractTransactionContext
Unable to roll back transaction
java.lang.IllegalStateException: Status is STATUS_NO_TRANSACTION
at
org.apache.geronimo.transaction.manager.TransactionImpl.rollback(TransactionImpl.java:438)
at
org.apache.geronimo.transaction.context.InheritableTransactionContext.rollbackAndThrow(InheritableTransactionContext.java:308)
at
org.apache.geronimo.transaction.context.InheritableTransactionContext.complete(InheritableTransactionContext.java:199)
at
org.apache.geronimo.transaction.context.InheritableTransactionContext.commit(InheritableTransactionContext.java:146)
at
org.apache.geronimo.transaction.context.GeronimoTransactionManager.commit(GeronimoTransactionManager.java:81)
at
org.apache.geronimo.transaction.context.GeronimoTransactionDelegate.commit(GeronimoTransactionDelegate.java:51)
at org.jencks.XAEndpoint.afterDelivery(XAEndpoint.java:103)
at
org.apache.activemq.ra.MessageEndpointProxy$MessageEndpointAlive.afterDelivery(MessageEndpointProxy.java:125)
at
org.apache.activemq.ra.MessageEndpointProxy.afterDelivery(MessageEndpointProxy.java:64)
at
org.apache.activemq.ra.ServerSessionImpl.afterDelivery(ServerSessionImpl.java:215)
at org.apache.activemq.ActiveMQSession.run(ActiveMQSession.java:744)
at
org.apache.activemq.ra.ServerSessionImpl.run(ServerSessionImpl.java:164)
at
org.apache.geronimo.connector.work.WorkerContext.run(WorkerContext.java:291)
at EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run(Unknown
Source)
at java.lang.Thread.run(Thread.java:595)
DEBUG org.apache.activemq.ra.ServerSessionImpl:0
Endpoint failed to process message.
java.lang.RuntimeException: Endpoint after delivery notification failure
at
org.apache.activemq.ra.ServerSessionImpl.afterDelivery(ServerSessionImpl.java:217)
at org.apache.activemq.ActiveMQSession.run(ActiveMQSession.java:744)
at
org.apache.activemq.ra.ServerSessionImpl.run(ServerSessionImpl.java:164)
at
org.apache.geronimo.connector.work.WorkerContext.run(WorkerContext.java:291)
at EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run(Unknown
Source)
at java.lang.Thread.run(Thread.java:595)
Caused by: java.lang.IllegalStateException: Cannot commit if the
transaction is not bound to the current thread
at
org.apache.geronimo.transaction.context.GeronimoTransactionDelegate.rollback(GeronimoTransactionDelegate.java:72)
at org.jencks.XAEndpoint.doRollback(XAEndpoint.java:143)
at org.jencks.XAEndpoint.afterDelivery(XAEndpoint.java:116)
at
org.apache.activemq.ra.MessageEndpointProxy$MessageEndpointAlive.afterDelivery(MessageEndpointProxy.java:125)
at
org.apache.activemq.ra.MessageEndpointProxy.afterDelivery(MessageEndpointProxy.java:64)
at
org.apache.activemq.ra.ServerSessionImpl.afterDelivery(ServerSessionImpl.java:215)
... 5 more
So, JMS operations in transaction can't rollback correctly and message
placed from messages.input to messages.output.
Please, help me to resolve this problem ...
--
Thanks,
Eugene Prokopiev