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.comOn 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>