> 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 <
cmoulliard@...>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.ibsen@...> wrote:
>>
>>> Hi
>>>
>>> Yeah you need to add all the spring transaction stuff.
>>>
>>>
>>> On Thu, Jul 2, 2009 at 3:47 PM, Charles Moulliard<
cmoulliard@...>
>>> 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>>>
>>
>>
>