On Fri, Jul 3, 2009 at 4:44 PM, Charles Moulliard<cmoulli...@gmail.com> wrote: > If I use as TransactionManager > > org.springframework.orm.hibernate3.HibernateTransactionManager > > in DAO layer > in Spring layer > in Camel route > > instead of > > org.springframework.transaction.PlatformTransactionManager > > It works. The transaction is well rollbacked !!!!! yes yes yes yes Ah yeah it is. Since the DB TX manager will handle the DB and since you are consuming from a JMS queue then Spring DefaultMessageListenerContainer will also rollback if a *runtime* exception is thrown back to it. And Camel does this in its TransactionErrorHandler. So yeah you are safe now.
Only problem is if you also want to send a JMS message in your route :) > > If you find a solution to use the JTATransactionManager Guillaume, you are > welcome ;-) > > Charles Moulliard > Senior Enterprise Architect > Apache Camel Committer > > ***************************** > blog : http://cmoulliard.blogspot.com > > > On Fri, Jul 3, 2009 at 4:14 PM, Charles Moulliard <cmoulli...@gmail.com>wrote: > >> OK. I will change my config to use a separate TransactionManager for DB >> stuffs. >> >> My idea was to use the same transaction manager (JTA) in the application >> for JMS, DB, ... transactions but If this is not possible ... >> >> Regards, >> >> Charles Moulliard >> Senior Enterprise Architect >> Apache Camel Committer >> >> ***************************** >> blog : http://cmoulliard.blogspot.com >> >> >> On Fri, Jul 3, 2009 at 4:08 PM, Claus Ibsen <claus.ib...@gmail.com> wrote: >> >>> On Fri, Jul 3, 2009 at 4:04 PM, Charles Moulliard<cmoulli...@gmail.com> >>> wrote: >>> > No. In the route presented here I don't make 2 independant DB calls. >>> Only >>> > one. The second bean called (generateError) only do a throw (without any >>> > Hibernate/DB call) >>> > >>> > By the way, in the example >>> > >>> apache-camel-source\components\camel-spring\src\test\java\org\apache\camel\spring\interceptor\TransactionalClientDataSourceTest.java, >>> > two DB calls are made by two different beans and rollback is done !! >>> Yes and it is because it uses a DB TX manager >>> >>> <!-- spring transaction manager --> >>> <bean id="txManager" >>> class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> >>> <property name="dataSource" ref="dataSource"/> >>> </bean> >>> >>> This TX manager knows about DB stuff. >>> >>> >>> >>> >>> > >>> > Regards, >>> > >>> > Charles Moulliard >>> > Senior Enterprise Architect >>> > Apache Camel Committer >>> > >>> > ***************************** >>> > blog : http://cmoulliard.blogspot.com >>> > >>> > >>> > On Fri, Jul 3, 2009 at 3:56 PM, Claus Ibsen <claus.ib...@gmail.com> >>> wrote: >>> > >>> >> On Fri, Jul 3, 2009 at 3:52 PM, Guillaume Nodet<gno...@gmail.com> >>> wrote: >>> >> > If the message is redelivered, this means there is a rollback. >>> >> > I guess the problem is that your DB is not enlisted in the >>> transaction. >>> >> > However, if you don't want to use XA and two phase commit, you should >>> >> > try to perform the database step as late as possible so that there is >>> >> very few >>> >> > chances that anything wrong happen after the data has been written to >>> the >>> >> DB. >>> >> > Btw, in your route, I don't see at which step the message is written >>> >> > to the DB ... ? >>> >> >>> >> He uses 2 independent DB calls and uses a JMS TX manager. Then its >>> >> bound not to be enlisted in the same TX manager. >>> >> So as G. Nodet said try to combine your DB calls into a single >>> >> invocation, eg you might need to start / stop a local DB transaction >>> >> yourself using Hibernate and/or JPA. >>> >> >>> >> >>> >> >>> >> > >>> >> > On Fri, Jul 3, 2009 at 15:26, Charles Moulliard<cmoulli...@gmail.com >>> > >>> >> wrote: >>> >> >> I have created a small route without JMS stuff. >>> >> >> >>> >> >> Here is the route : >>> >> >> >>> >> >> <camel:route> >>> >> >> <camel:from ref="fileClientEndpoint" /> >>> >> >> >>> >> >> <camel:setHeader headerName="origin"> >>> >> >> <camel:constant>file</camel:constant> >>> >> >> </camel:setHeader> >>> >> >> <camel:setHeader headerName="messageType"> >>> >> >> <camel:constant>OINP</camel:constant> >>> >> >> </camel:setHeader> >>> >> >> <camel:convertBodyTo type="java.lang.String"/> >>> >> >> <camel:to ref="directRequestEndpoint" /> >>> >> >> </camel:route> >>> >> >> >>> >> >> <camel:route> >>> >> >> <camel:from ref="directRequestEndpoint" /> >>> >> >> <camel:transacted ref="PROPAGATION_REQUIRED"/> >>> >> >> <!-- Call the requestService to save the request --> >>> >> >> <camel:bean ref="serviceHelper" method="createRequest"/> >>> >> >> <camel:bean ref="serviceHelper" method="generateError" /> >>> >> >> <camel:to uri="direct:testTx"/> >>> >> >> </camel:route> >>> >> >> >>> >> >> Unfortunately when a throw error is generated in bean called >>> >> "generateError" >>> >> >> >>> >> >> public void generateError() { >>> >> >> throw new IllegalArgumentException("Generate error to >>> test >>> >> >> rollback"); >>> >> >> } >>> >> >> >>> >> >> records are committed in the DB and not rollbacked >>> >> >> >>> >> >> >>> >> >> I see that when the error is throw the message is redelivered a >>> second >>> >> time >>> >> >> as this parameter has been defined in the ActiveMq >>> >> >> >>> >> >> <bean id="x3sPolicy" >>> class="org.apache.activemq.RedeliveryPolicy"> >>> >> >> * <property name="maximumRedeliveries" value="1"/>* >>> >> >> </bean> >>> >> >> >>> >> >> <bean id="activemqConnectionFactory" >>> >> >> class="org.apache.activemq.ActiveMQConnectionFactory"> >>> >> >> <property name="brokerURL" value="tcp://localhost:61616" /> >>> >> >> <property name="redeliveryPolicy" ref="x3sPolicy"/> >>> >> >> </bean> >>> >> >> >>> >> >> Question : Why policy defined in the ActiveMq is taken into account >>> >> here ? >>> >> >> Why the rollback does not occur ? >>> >> >> >>> >> >> Charles Moulliard >>> >> >> Senior Enterprise Architect >>> >> >> Apache Camel Committer >>> >> >> >>> >> >> ***************************** >>> >> >> blog : http://cmoulliard.blogspot.com >>> >> >> >>> >> >> >>> >> >> On Fri, Jul 3, 2009 at 12:28 PM, Claus Ibsen <claus.ib...@gmail.com >>> > >>> >> wrote: >>> >> >> >>> >> >>> On Fri, Jul 3, 2009 at 12:16 PM, Guillaume Nodet<gno...@gmail.com> >>> >> wrote: >>> >> >>> > In this case, you should not use transactions for the DB at all, >>> but >>> >> >>> > if any error occurs while saving the data, an exception should be >>> >> >>> > thrown and should rollback the transaction for the JMS layer. >>> >> >>> Yeah that would be perfect unless he does some work afterwards the >>> DB >>> >> >>> and that throws an Exception. >>> >> >>> Then the DB layer have already committed. >>> >> >>> >>> >> >>> So trying to avoid doing work after the DB layer would help. >>> >> >>> >>> >> >>> >>> >> >>> Is this not possible? >>> >> >>> But he is doing JPA/Hibernte stuff so he could grab the "session" >>> and >>> >> >>> invoke a rollback manually in case errors happen afterwards. >>> >> >>> >>> >> >>> >>> >> >>> >>> >> >>> >>> >> >>> > >>> >> >>> > On Fri, Jul 3, 2009 at 10:48, Charles Moulliard< >>> cmoulli...@gmail.com >>> >> > >>> >> >>> wrote: >>> >> >>> >> Claus, >>> >> >>> >> >>> >> >>> >> I don't want at all to use XA transaction. Correct me if I'm >>> wrong >>> >> but >>> >> >>> the >>> >> >>> >> example of the documentation (Camel 2.0 - JMS Sample - part >>> Spring >>> >> XML) >>> >> >>> does >>> >> >>> >> not use at all a XA driver and the message will not be removed >>> from >>> >> the >>> >> >>> >> queue if a rollback occurs in the bean MyProcessor ? >>> >> >>> >> >>> >> >>> >> My concern is to avoid to lost messages from a file, queues if >>> >> something >>> >> >>> >> happen in one of the services called where by example we have to >>> >> save >>> >> >>> data >>> >> >>> >> in a DB or generate a report for a client. If such errors occur, >>> >> then we >>> >> >>> >> have to investigate why can't save data in DB (maybe related to >>> a >>> >> >>> connection >>> >> >>> >> issue, DB shutdown, ...) or generates files (maybe due to disk >>> full, >>> >> >>> access >>> >> >>> >> right, ....). Sometimes, this is related to conditions out of >>> the >>> >> >>> control of >>> >> >>> >> our application but sometimes no, then we have to correct the >>> error >>> >> and >>> >> >>> >> install a new version of the code. After the restart of the >>> >> application >>> >> >>> and >>> >> >>> >> recovery of messages (persisted in the case of activemq), >>> messages >>> >> will >>> >> >>> be >>> >> >>> >> reprocessed. >>> >> >>> >> >>> >> >>> >> Regards, >>> >> >>> >> >>> >> >>> >> Charles Moulliard >>> >> >>> >> Senior Enterprise Architect >>> >> >>> >> Apache Camel Committer >>> >> >>> >> >>> >> >>> >> ***************************** >>> >> >>> >> blog : http://cmoulliard.blogspot.com >>> >> >>> >> >>> >> >>> >> >>> >> >>> >> On Fri, Jul 3, 2009 at 10:26 AM, Claus Ibsen < >>> claus.ib...@gmail.com >>> >> > >>> >> >>> wrote: >>> >> >>> >> >>> >> >>> >>> And reconsider if you need XA at all. Its slow and hard to get >>> >> setup. >>> >> >>> >>> >>> >> >>> >>> Try to let the DB be the last stuff you do and afterwards send >>> the >>> >> >>> >>> message to another queue for further processing in a 2nd route. >>> >> >>> >>> If that is possible in your use-case. >>> >> >>> >>> >>> >> >>> >>> >>> >> >>> >>> On Fri, Jul 3, 2009 at 10:25 AM, Claus Ibsen< >>> claus.ib...@gmail.com >>> >> > >>> >> >>> wrote: >>> >> >>> >>> > 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 >>> >> >>> >>> > >>> >> >>> >>> >>> >> >>> >>> >>> >> >>> >>> >>> >> >>> >>> -- >>> >> >>> >>> Claus Ibsen >>> >> >>> >>> Apache Camel Committer >>> >> >>> >>> >>> >> >>> >>> Open Source Integration: http://fusesource.com >>> >> >>> >>> Blog: http://davsclaus.blogspot.com/ >>> >> >>> >>> Twitter: http://twitter.com/davsclaus >>> >> >>> >>> >>> >> >>> >> >>> >> >>> > >>> >> >>> > >>> >> >>> > >>> >> >>> > -- >>> >> >>> > Cheers, >>> >> >>> > Guillaume Nodet >>> >> >>> > ------------------------ >>> >> >>> > Blog: http://gnodet.blogspot.com/ >>> >> >>> > ------------------------ >>> >> >>> > Open Source SOA >>> >> >>> > http://fusesource.com >>> >> >>> > >>> >> >>> >>> >> >>> >>> >> >>> >>> >> >>> -- >>> >> >>> Claus Ibsen >>> >> >>> Apache Camel Committer >>> >> >>> >>> >> >>> Open Source Integration: http://fusesource.com >>> >> >>> Blog: http://davsclaus.blogspot.com/ >>> >> >>> Twitter: http://twitter.com/davsclaus >>> >> >>> >>> >> >> >>> >> > >>> >> > >>> >> > >>> >> > -- >>> >> > Cheers, >>> >> > Guillaume Nodet >>> >> > ------------------------ >>> >> > Blog: http://gnodet.blogspot.com/ >>> >> > ------------------------ >>> >> > Open Source SOA >>> >> > http://fusesource.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