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&amp;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
>>
>
>

Reply via email to