Hi,
I am using apache camel 1.6.1, oracle as 10.1.3.3, spring 2.5., aspectj
1.5.4
Here is the stacktrace:
1817082 2009-08-03 17:20:33,623 DEBUG
org.apache.camel.component.jms.EndpointMessageListener.onMessage(63) -
Endpoint[oracle:queue:java:comp/resource/WeborderJmsResourceProvider/Queues/JMSEXAMPLE?maxMessagesPerTask=-1]
consumer receiving JMS message: oracle.jms.AQjmsTextMessage@74e259
1817082 2009-08-03 17:20:33,623 DEBUG
org.apache.camel.impl.converter.DefaultTypeConverter.doConvertTo(96) -
Converting null -> java.lang.Boolean with value: null
1817082 2009-08-03 17:20:33,623 DEBUG
org.springframework.transaction.support.AbstractPlatformTransactionManager.handleExistingTransaction(469)
- Participating in existing transaction
1817082 2009-08-03 17:20:33,623 DEBUG
org.apache.camel.spring.spi.TransactionInterceptor$1.doInTransactionWithoutResult(101)
- Is actual transaction active: true
1817082 2009-08-03 17:20:33,623 DEBUG
org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(214)
- Returning cached instance of singleton bean 'testProcessor'
1817097 2009-08-03 17:20:33,638 DEBUG
org.springframework.jdbc.core.JdbcTemplate.execute(417) - Executing SQL
statement [insert into test values ('this is only test')]
1817097 2009-08-03 17:20:33,638 DEBUG
org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(112) -
Fetching JDBC Connection from DataSource
1817097 2009-08-03 17:20:33,638 DEBUG
org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(116) -
Registering transaction synchronization for JDBC Connection
1817097 2009-08-03 17:20:33,638 DEBUG
org.springframework.transaction.support.TransactionSynchronizationManager.bindResource(186)
- Bound value [org.springframework.jdbc.datasource.ConnectionHolder@d8b0f6]
for key [oracle.oc4j.sql.ManagedDataSource@5cba16] to thread
[DefaultMessageListenerContainer-7]
1817097 2009-08-03 17:20:33,638 DEBUG
org.springframework.transaction.support.TransactionSynchronizationManager.getResource(142)
- Retrieved value
[org.springframework.jdbc.datasource.ConnectionHolder@d8b0f6] for key
[oracle.oc4j.sql.ManagedDataSource@5cba16] bound to thread
[DefaultMessageListenerContainer-7]
1817113 2009-08-03 17:20:33,654 DEBUG
org.springframework.transaction.support.TransactionSynchronizationManager.getResource(142)
- Retrieved value
[org.springframework.jdbc.datasource.ConnectionHolder@d8b0f6] for key
[oracle.oc4j.sql.ManagedDataSource@5cba16] bound to thread
[DefaultMessageListenerContainer-7]
1817113 2009-08-03 17:20:33,654 DEBUG
org.springframework.transaction.support.TransactionSynchronizationManager.getResource(142)
- Retrieved value
[org.springframework.jms.listener.LocallyExposedJmsResourceHolder@13223ad]
for key [oracle.jms.AQjmsQueueConnectionFactory@130fa43] bound to thread
[DefaultMessageListenerContainer-7]
1817113 2009-08-03 17:20:33,654 DEBUG
org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(328)
- Rolling back transaction because of listener exception thrown:
oracle.jms.AQjmsException: Die Methode 'commit' kann nicht aufgerufen
werden, wenn eine globale Transaktion aktiv ist.
1817113 2009-08-03 17:20:33,654 WARN
org.springframework.jms.listener.AbstractMessageListenerContainer.handleListenerException(646)
- Execution of JMS message listener failed
oracle.jms.AQjmsException: Die Methode 'commit' kann nicht aufgerufen
werden, wenn eine globale Transaktion aktiv ist.
at oracle.jms.AQjmsSession.commitNoCheck(AQjmsSession.java:815)
at oracle.jms.AQjmsSession.commit(AQjmsSession.java:784)
at
org.springframework.jms.support.JmsUtils.commitIfNecessary(JmsUtils.java:217)
at
org.springframework.jms.listener.AbstractMessageListenerContainer.commitIfNecessary(AbstractMessageListenerContainer.java:558)
at
org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:465)
at
org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:323)
at
org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:241)
at
org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:982)
at
org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:974)
at
org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:876)
at java.lang.Thread.run(Thread.java:595)
[Linked-exception]
java.sql.SQLException: Die Methode 'commit' kann nicht aufgerufen werden,
wenn eine globale Transaktion aktiv ist.
at
oracle.oc4j.sql.spi.ConnectionHandle.oc4j_throwSQLExceptionIfGlobalTxActive(ConnectionHandle.java:417)
at oracle.oc4j.sql.spi.ConnectionHandle.commit(ConnectionHandle.java:123)
at oracle.jms.AQjmsSession.commitNoCheck(AQjmsSession.java:811)
at oracle.jms.AQjmsSession.commit(AQjmsSession.java:784)
at
org.springframework.jms.support.JmsUtils.commitIfNecessary(JmsUtils.java:217)
at
org.springframework.jms.listener.AbstractMessageListenerContainer.commitIfNecessary(AbstractMessageListenerContainer.java:558)
at
org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:465)
at
org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:323)
at
org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:241)
at
org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:982)
at
org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:974)
at
org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:876)
at java.lang.Thread.run(Thread.java:595)
The error message is in german, but you can guess what it means "Cannot call
commit in a global transaction".
I did already looked in google, and did not find it.
As you suggested I will try to find some working example with oc4j spring
jdbc and xa.
thx,
Sasa
Claus Ibsen-2 wrote:
Hi
Which versions of the various products are you using?
And when you get an error shown the real stacktrace / error message helps.
And try use google on this exception / stacktrace to find others with
same problem.
And try get a sample working with Oracle + Spring + JDBC + XA to
ensure that combo works before throwing in annotations, aop and other
stuff that just complicates matter.
And there was an issue in Camel 1.6.0 or older with sometimes Spring
did not do IoC on classes with @annotations. It did output something
about bean XXX not being eligible for ... So check whether Spring
logs this in your case.
On Mon, Aug 3, 2009 at 5:57 PM,
smilicevicswrote:
Hi,
I am trying to write code which will consume a message and do the insert
in
database.
I want to use global transactions and two-phase-commit.
I got always the same error: cannot commit in global transaction.
Can somebody tell me what am i doing wrong here:
this is my spring xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:camel="http://activemq.apache.org/camel/schema/spring"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsdhttp://activemq.apache.org/camel/schema/spring camel-spring.xsd
http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-2.0.xsdhttp://www.springframework.org/schema/aop" rel="nofollow">http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"><camel:camelContext id="camel">
<camel:route>
<camel:from
uri="oracle:queue:java:comp/resource/WeborderJmsResourceProvider/Queues/JMSEXAMPLE?maxMessagesPerTask=-1"
/>
<camel:to uri="bean:testProcessor" />
</camel:route>
</camel:camelContext>
<camel:template id="camelTemplate" />
<bean id="oracle"
class="org.apache.camel.component.jms.JmsComponent">
<property name="connectionFactory"
ref="oJmsQueueConnectionFactory" />
<property name="destinationResolver"
ref="jmsDestinationResolver" />
<property name="transacted" value="true" />
<property name="transactionManager"
ref="transactionManager" />
</bean>
<bean id="jmsDestinationResolver"
class="org.springframework.jms.support.destination.JndiDestinationResolver">
<property name="jndiTemplate" ref="jndiTemplate" />
<property name="cache" value="true" />
</bean>
<bean id="transactionManager"
class="org.springframework.transaction.jta.OC4JJtaTransactionManager" />
<bean id="oJmsQueueConnectionFactory"
class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiTemplate" ref="jndiTemplate" />
<property name="jndiName">
<value>java:comp/resource/WeborderJmsResourceProvider/QueueConnectionFactories/QCF</value>
</property>
</bean>
<bean id="jndiTemplate"
class="org.springframework.jndi.JndiTemplate" />
<bean id="testProcessor" class="oc4j.test.TestProcessor">
<property name="testImpl" ref="testImpl" />
</bean>
<bean id="testDataSource"
class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="jdbc/WeborderJmsDS" />
</bean>
<bean id="testImpl" class="oc4j.test.TestImpl">
<property name="dataSource" ref="testDataSource" />
</bean>
<aop:config>
<aop:pointcut id="process" expression="execution(*
oc4j.test.*)"/>
<aop:advisor pointcut-ref="process"
advice-ref="txAdvice"/>
</aop:config>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="process" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
</beans>
and TestProcessor:
public class TestProcessor implements Processor {
private TestImpl test = null;
public void setTestImpl(TestImpl test) {
this.test = test;
}
@Transactional(propagation = Propagation.REQUIRED)
public void process(Exchange arg0) throws Exception {
Logger logger = Logger
.getLogger("oc4j.test.Oc4jServletContextListener");
test.insertTest();
logger.info("Received exchange: " + arg0.getIn());
logger.info("Received exchange: " +
arg0.getIn().getBody());
}
}
and TestImpl:
public class TestImpl extends JdbcDaoSupport {
public void insertTest() {
getJdbcTemplate().execute("insert into test values ('this
is only
test')");
}
}
thanks in advance.
Sasa
--
View this message in context:
http://www.nabble.com/Two-Phase-Commit-with-JCA%2C-Spring%2C-Camel-and-OC4j-tp24793274p24793274.htmlSent from the Camel - Users mailing list archive at Nabble.com.
--
Claus Ibsen
Apache Camel Committer
Open Source Integration:
http://fusesource.comBlog:
http://davsclaus.blogspot.com/Twitter:
http://twitter.com/davsclaus--
View this message in context:
http://www.nabble.com/Two-Phase-Commit-with-JCA%2C-Spring%2C-Camel-and-OC4j-tp24793274p24803834.htmlSent from the Camel - Users mailing list archive at Nabble.com.