Hi Get it working outside OSGi, eg in a small unit test thats easy to run and test from within your IDE. Google for JMS + hibernate + TX + XA to find some samples that work.
And since you use JMS + DB in the same TX you need to use XA db driver. It can be a painful to get setup http://coffeedrivenjava.blogspot.com/2006/08/distributed-xa-transactions-w-hibernate.html And you need an XA TX manager such as JOTM http://jotm.ow2.org/xwiki/bin/view/Main/WebHome In j2ee land there was a JTA with the container that could do it. But in your OSGi container I do not know if it provides one out of the box. On Fri, Jul 3, 2009 at 10:09 AM, Charles Moulliard<cmoulli...@gmail.com> wrote: > I'm still fighting against Spring config or Camel because Rollback does not > occur. I have been able to configure Hibernate to use the same > TransactionManager as the one used by JMS > > Here is the different part of the config. I don't know where the issue could > be ! > > 1) ActiveMQ > > ... > > <bean id="activemqConnectionFactory" > class="org.apache.activemq.ActiveMQConnectionFactory"> > <property name="brokerURL" value="tcp://localhost:61616" /> > </bean> > > <bean id="pooledConnectionFactory" > class="org.apache.activemq.pool.PooledConnectionFactoryBean"> > <property name="maxConnections" value="8" /> > <property name="maximumActive" value="500" /> > <property name="transactionManager" ref="transactionManager" /> > <property name="connectionFactory" ref="activemqConnectionFactory" > /> > <property name="resourceName" value="activemq.default" /> > </bean> > > <bean id="resourceManager" > class="org.apache.activemq.pool.ActiveMQResourceManager" > init-method="recoverResource"> > <property name="transactionManager" ref="transactionManager" /> > <property name="connectionFactory" ref="activemqConnectionFactory" > /> > <property name="resourceName" value="activemq.default" /> > </bean> > > <osgi:reference id="transactionManager" > interface="javax.transaction.TransactionManager" /> // This OSGI service is > published by Geronimo Transaction bundle > > <osgi:service ref="pooledConnectionFactory"> > <osgi:interfaces> > <value>javax.jms.ConnectionFactory</value> > </osgi:interfaces> > <osgi:service-properties> > <entry key="name" value="default"/> > </osgi:service-properties> > </osgi:service> > > 2) Camel ActiveMQComponent > > <bean id="active-mq" > class="org.apache.activemq.camel.component.ActiveMQComponent"> > <property name="transacted" value="true"/> > <property name="connectionFactory"> > <osgi:reference interface="javax.jms.ConnectionFactory"/> // > OSGI service is published by ActiveMQ service > </property> > <property name="transactionManager"> > <osgi:reference > interface="org.springframework.transaction.PlatformTransactionManager"/> > </property> > </bean> > > 2) Hibernate - DAO > > <bean id="sessionFactory" > class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> > > <property name="mappingLocations"> > <list> > > <value>classpath*:META-INF/com/xpectis/x3s/platform/model/*.hbm.xml</value> > </list> > </property> > > <property name="hibernateProperties"> > <props> > <prop > key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> > <prop key="hibernate.show_sql">true</prop> > <prop key="hibernate.format_sql">true</prop> > <prop > key="hibernate.cglib.use_reflection_optimizer">true</prop> > <prop key="hibernate.jdbc.batch_size">10</prop> > <prop > key="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</prop> > <prop > key="hibernate.transaction.factory_class">org.springframework.orm.hibernate3.SpringTransactionFactory</prop> > </props> > </property> > <property name="dataSource"> > <ref bean="dataSource" /> > </property> > > Remark : To avoid the JNDI lookup issue, we use springTransactionFactory as > the TransactionFactory for Hibernate ( > http://forum.springsource.org/showthread.php?p=215720) > > 3) Service layer > > Here is the definition of the service used from Camel route : > > <bean id="notificationServiceTarget" > class="com.xpectis.x3s.platform.service.impl.NotificationServiceImpl"> > <property name="notificationDAO"> > <osgi:reference > interface="com.xpectis.x3s.platform.dao.NotificationDAO"/> > </property> > > </bean> > > <!-- Abstract service using the Geronimo Transaction Manager --> > <bean id="abstractService" abstract="true" > class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> > <property name="transactionManager"> > <osgi:reference > interface="org.springframework.transaction.PlatformTransactionManager"/> > </property> > </bean> > > <bean id="notificationService" > parent="abstractService" > > class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> > > <property name="target"> > <ref bean="notificationServiceTarget" /> > </property> > > <property name="transactionAttributes"> > <props> > <prop key="*">PROPAGATION_REQUIRED</prop> > </props> > </property> > </bean> > > 4) Route > > <bean id="myPolicy" class="org.apache.camel.processor.RedeliveryPolicy"> > <property name="maximumRedeliveries" value="1"/> > </bean> > > <bean id="txErrorHandler" > class="org.apache.camel.spring.spi.TransactionErrorHandlerBuilder"> > <property name="springTransactionPolicy" > ref="PROPAGATION_REQUIRED"/> > <property name="redeliveryPolicy" ref="myPolicy"/> > </bean> > > <bean id="PROPAGATION_REQUIRED" > class="org.apache.camel.spring.spi.SpringTransactionPolicy"> > <property name="transactionManager"> > <osgi:reference > interface="org.springframework.transaction.PlatformTransactionManager"/> > </property> > </bean> > > <camel:route errorHandlerRef="txErrorHandler"> > <camel:from ref="queueQuickFixInEndpoint" /> > <camel:convertBodyTo type="quickfix.Message" /> > <camel:transacted ref="PROPAGATION_REQUIRED"/> > <camel:bean ref="serviceHelper" method="createNotification" /> > <camel:bean ref="serviceHelper" method="generateError" /> > <camel:to ref="directNotificationEndpoint" /> > </camel:route> > > Any ideas are welcome > > Regards, > > Charles Moulliard > Senior Enterprise Architect > Apache Camel Committer > > ***************************** > blog : http://cmoulliard.blogspot.com > > > On Thu, Jul 2, 2009 at 5:02 PM, Charles Moulliard <cmoulli...@gmail.com>wrote: > >> OK. I will try to create my own Hibernate JTATransaction manager as the >> existing try to perform a JNDI lookup to find the transaction manager on >> OSGI platform (inheritage from J2EE world) >> >> >> http://mail-archives.apache.org/mod_mbox/servicemix-dev/200904.mbox/%3cb23ecedc0904020615y55df4d0fhb303a2ea22df7...@mail.gmail.com%3e >> >> >> Charles Moulliard >> Senior Enterprise Architect >> Apache Camel Committer >> >> ***************************** >> blog : http://cmoulliard.blogspot.com >> >> >> On Thu, Jul 2, 2009 at 4:56 PM, Claus Ibsen <claus.ib...@gmail.com> wrote: >> >>> On Thu, Jul 2, 2009 at 4:53 PM, Charles Moulliard<cmoulli...@gmail.com> >>> wrote: >>> > queueQuickFixInEndpoint is a JMS queue. >>> > >>> > I will add the ref to the transacted and retest >>> > >>> > Question : I suppose that rollback will not occur if by example JMS and >>> DB >>> > (=Hibernate) does not use the same TransactionManager and don't use this >>> > spring class together : >>> > org.springframework.transaction.PlatformTransactionManager >>> Yes they must be configured to use the same TX manager. >>> >>> >>> > >>> > 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.ib...@gmail.com> >>> 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<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 >>> >> >>> > >>> >>> >>> >>> -- >>> 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