Transacted also have a ref attribute <transacted ref="required"/>
Is queueQuickFixInEndpoint a JMS queue? You need to use a TX manager that can do both JMS and DB. On Thu, Jul 2, 2009 at 4:31 PM, Charles Moulliard<cmoulli...@gmail.com> wrote: > I have been able to solve my problem by adding the following bean definition > : > > <bean id="required" > class="org.apache.camel.spring.spi.SpringTransactionPolicy"> > <property name="transactionManager"> > <osgi:reference > interface="org.springframework.transaction.PlatformTransactionManager"/> > </property> > </bean> > > and in the route > > <camel:route> > <camel:from ref="queueQuickFixInEndpoint" /> > <camel:convertBodyTo type="quickfix.Message" /> > <camel:transacted/> > <camel:policy ref="required" /> > <camel:bean ref="serviceHelper" method="createNotification" /> > <camel:bean ref="serviceHelper" method="generateError" /> > <camel:to ref="directNotificationEndpoint" /> > </camel:route> > > Unfortunately, the rollback does not occur in the DB and 6 records have been > created by the method createNotification when error has been raised by the > method generateError. > > What is missing ? > > Charles Moulliard > Senior Enterprise Architect > Apache Camel Committer > > ***************************** > blog : http://cmoulliard.blogspot.com > > > On Thu, Jul 2, 2009 at 4:19 PM, Charles Moulliard <cmoulli...@gmail.com>wrote: > >> When I compare the example : JMSTransactionalClientRollbackTest.xml >> >> <!-- START SNIPPET: e1 --> >> <!-- setup JMS connection factory --> >> <bean id="jmsConnectionFactory" >> class="org.apache.activemq.ActiveMQConnectionFactory"> >> <property name="brokerURL" >> value="vm://localhost?broker.persistent=false&broker.useJmx=false"/> >> </bean> >> >> <!-- setup spring jms TX manager --> >> <bean id="jmsTransactionManager" >> class="org.springframework.jms.connection.JmsTransactionManager"> >> <property name="connectionFactory" ref="jmsConnectionFactory"/> >> </bean> >> >> <!-- define our activemq component --> >> <bean id="activemq" >> class="org.apache.activemq.camel.component.ActiveMQComponent"> >> <property name="connectionFactory" ref="jmsConnectionFactory"/> >> <!-- define the jms consumer/producer as transacted --> >> <property name="transacted" value="true"/> >> <!-- setup the transaction manager to use --> >> <!-- if not provided then Camel will automatic use a >> JmsTransactionManager, however if you >> for instance use a JTA transaction manager then you must >> configure it --> >> <property name="transactionManager" ref="jmsTransactionManager"/> >> </bean> >> <!-- END SNIPPET: e1 --> >> >> <!-- START SNIPPET: e2 --> >> <camelContext xmlns="http://camel.apache.org/schema/spring"> >> <route> >> <!-- 1: from the jms queue --> >> <from uri="activemq:queue:okay"/> >> <!-- 2: mark this route as transacted --> >> <transacted/> >> <!-- 3: call our business logic that is myProcessor --> >> <process ref="myProcessor"/> >> <!-- 4: if success then send it to the mock --> >> <to uri="mock:result"/> >> </route> >> </camelContext> >> >> with mine. >> >> What is different concerns the TransactionManager used. >> >> In the example, this is the Spring one: >> >> <!-- setup spring jms TX manager --> >> <bean id="jmsTransactionManager" >> class="org.springframework.jms.connection.JmsTransactionManager"> >> <property name="connectionFactory" ref="jmsConnectionFactory"/> >> </bean> >> >> and in my case, ActiveMQ is configured to use Geronimo Transaction Manager >> bundle (which in fact uses spring Transaction manager : >> org.springframework.transaction.jta.JtaTransactionManager;) >> >> I suppose that in the example, the policy is defined by default by spring >> when instantiating the class : >> org.springframework.jms.connection.JmsTransactionManager >> >> Is it possible to do the same using a JtaTransaction manager ? >> >> Regards, >> >> Charles Moulliard >> Senior Enterprise Architect >> Apache Camel Committer >> >> ***************************** >> blog : http://cmoulliard.blogspot.com >> >> >> On Thu, Jul 2, 2009 at 3:57 PM, Claus Ibsen <claus.ib...@gmail.com> wrote: >> >>> Hi >>> >>> Yeah you need to add all the spring transaction stuff. >>> >>> >>> On Thu, Jul 2, 2009 at 3:47 PM, Charles Moulliard<cmoulli...@gmail.com> >>> wrote: >>> > Camel generates the following error with my route : >>> > >>> > Route >>> > >>> > <camel:route> >>> > <camel:from ref="queueQuickFixInEndpoint" /> >>> > <camel:convertBodyTo type="quickfix.Message" /> >>> > <camel:transacted/> >>> > <camel:bean ref="serviceHelper" method="createNotification" >>> /> >>> > <camel:bean ref="serviceHelper" method="generateError" /> >>> > <camel:to ref="directNotificationEndpoint" /> >>> > </camel:route> >>> > >>> > It seems that policy must be defined but in the example here it is not >>> > mentioned : http://camel.apache.org/transactional-client.html >>> > >>> > Error : >>> > >>> > 15:43:07,838 | ERROR | xtenderThread-30 | ContextLoaderListener >>> | >>> > BundleApplicationContextListener 50 | Application context refresh >>> failed >>> > (OsgiBundleXmlApplicationContext(bundle=com.xpectis.x3s.x3s-core, >>> > config=osgibundle:/META-INF/spring/*.xml)) >>> > org.apache.camel.RuntimeCamelException: >>> java.lang.IllegalArgumentException: >>> > policy must be specified on: Transacted[ref: null] >>> > at >>> > >>> org.apache.camel.util.ObjectHelper.wrapRuntimeCamelException(ObjectHelper.java:986) >>> > at >>> > >>> org.apache.camel.spring.SpringCamelContext.onApplicationEvent(SpringCamelContext.java:121) >>> > at >>> > >>> org.apache.camel.spring.CamelContextFactoryBean.onApplicationEvent(CamelContextFactoryBean.java:465) >>> > at >>> > >>> org.springframework.context.event.SimpleApplicationEventMulticaster$1.run(SimpleApplicationEventMulticaster.java:78) >>> > at >>> > >>> org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:49) >>> > at >>> > >>> org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:76) >>> > at >>> > >>> org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:274) >>> > at >>> > >>> org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:736) >>> > at >>> > >>> org.springframework.osgi.context.support.AbstractOsgiBundleApplicationContext.finishRefresh(AbstractOsgiBundleApplicationContext.java:235) >>> > at >>> > >>> org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext$4.run(AbstractDelegatedExecutionApplicationContext.java:358) >>> > at >>> > >>> org.springframework.osgi.util.internal.PrivilegedUtils.executeWithCustomTCCL(PrivilegedUtils.java:85) >>> > at >>> > >>> org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext.completeRefresh(AbstractDelegatedExecutionApplicationContext.java:320) >>> > at >>> > >>> org.springframework.osgi.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor$CompleteRefreshTask.run(DependencyWaiterApplicationContextExecutor.java:136) >>> > at java.lang.Thread.run(Thread.java:619) >>> > Caused by: java.lang.IllegalArgumentException: policy must be specified >>> on: >>> > Transacted[ref: null] >>> > at org.apache.camel.util.ObjectHelper.notNull(ObjectHelper.java:258) >>> > at >>> > >>> org.apache.camel.model.TransactedDefinition.createProcessor(TransactedDefinition.java:129) >>> > at >>> > >>> org.apache.camel.model.ProcessorDefinition.makeProcessor(ProcessorDefinition.java:226) >>> > at >>> > >>> org.apache.camel.model.ProcessorDefinition.addRoutes(ProcessorDefinition.java:111) >>> > at >>> > >>> org.apache.camel.model.RouteDefinition.addRoutes(RouteDefinition.java:294) >>> > at >>> > >>> org.apache.camel.model.RouteDefinition.addRoutes(RouteDefinition.java:120) >>> > at >>> > >>> org.apache.camel.impl.DefaultCamelContext.startRoute(DefaultCamelContext.java:552) >>> > at >>> > >>> org.apache.camel.impl.DefaultCamelContext.startRouteDefinitions(DefaultCamelContext.java:969) >>> > at >>> > >>> org.apache.camel.impl.DefaultCamelContext.doStart(DefaultCamelContext.java:946) >>> > at >>> > >>> org.apache.camel.spring.SpringCamelContext.maybeDoStart(SpringCamelContext.java:165) >>> > at >>> > >>> org.apache.camel.spring.SpringCamelContext.doStart(SpringCamelContext.java:160) >>> > at org.apache.camel.impl.ServiceSupport.start(ServiceSupport.java:52) >>> > at >>> > >>> org.apache.camel.impl.DefaultCamelContext.start(DefaultCamelContext.java:863) >>> > at >>> > >>> org.apache.camel.spring.SpringCamelContext.maybeStart(SpringCamelContext.java:99) >>> > at >>> > >>> org.apache.camel.spring.SpringCamelContext.onApplicationEvent(SpringCamelContext.java:119) >>> > Charles Moulliard >>> > Senior Enterprise Architect >>> > Apache Camel Committer >>> > >>> > ***************************** >>> > blog : http://cmoulliard.blogspot.com >>> > >>> >>> >>> >>> -- >>> Claus Ibsen >>> Apache Camel Committer >>> >>> Open Source Integration: http://fusesource.com >>> Blog: http://davsclaus.blogspot.com/ >>> Twitter: http://twitter.com/davsclaus >>> >> >> > -- Claus Ibsen Apache Camel Committer Open Source Integration: http://fusesource.com Blog: http://davsclaus.blogspot.com/ Twitter: http://twitter.com/davsclaus