>
> Regards,
>
> Charles Moulliard
> Senior Enterprise Architect
> Apache Camel Committer
>
> *****************************
> blog :
http://cmoulliard.blogspot.com>
>
> On Thu, Jul 2, 2009 at 4:46 PM, Claus Ibsen <
claus.ibsen@...> wrote:
>
>> 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<
cmoulliard@...>
>> 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 <
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>> >>>
>> >>
>> >>
>> >
>>
>>
>>
>> --
>> Claus Ibsen
>> Apache Camel Committer
>>
>> Open Source Integration:
http://fusesource.com>> Blog:
http://davsclaus.blogspot.com/>> Twitter:
http://twitter.com/davsclaus>>
>