Could you try using only one transaction manager?

Best,
Christian

On Tue, Apr 17, 2012 at 10:48 PM, Raul Kripalani <r...@fusesource.com>wrote:

> It looks like you may not be using an XA-aware Pooled Connection Factory :D
>
> See
> http://activemq.apache.org/maven/5.5.0/activemq-pool/apidocs/org/apache/activemq/pool/XaPooledConnectionFactory.html
>
> It may look catchy, but all the layers of the stack need to be
> XA-aware, as XA requires a different behaviour when handling borrowing
> and returning to the pool.
>
> Let me know if it works for you.
>
> Regards,
> Raul.
>
> On 17 Apr 2012, at 18:31, Chris Geer <ch...@cxtsoftware.com> wrote:
>
> > Raul,
> >
> > Thanks for the information. I tried what you said and I think it did have
> > some success with rolling back the transaction but it causes significant
> > errors to be thrown during a success case. As I've written a sample to
> > debug this issue I wanted you to have my latest code so we can be
> > referencing the same thing if you're willing to take another look.
> >
> > README: http://pastebin.com/UWq3yk4c
> > OSGI Implementation: http://pastebin.com/ifQTybn3
> > OSGI Interface: http://pastebin.com/zEUP8jJJ
> > Blueprint File: http://pastebin.com/sxBtxNCq
> > Test Driver/Logger: http://pastebin.com/SDVFvjGm
> > pom.xml: http://pastebin.com/kTXXaebV
> >
> > Part of the error I'm seeing is this (commit -> rollback)
> >
> > 10:12:52,624 | WARN  | 52 - timer://foo | PooledSession
> > | 57 - org.apache.activemq.activemq-pool - 5.5.1 | Caught exception
> trying
> > rollback() when putting session back into the pool:
> > javax.jms.TransactionInProgressException: Cannot rollback() inside an
> > XASession
> > javax.jms.TransactionInProgressException: Cannot rollback() inside an
> > XASession
> > at
> >
> org.apache.activemq.ActiveMQXASession.rollback(ActiveMQXASession.java:76)[60:org.apache.activemq.activemq-core:5.5.1]
> > at
> >
> org.apache.activemq.pool.PooledSession.close(PooledSession.java:111)[57:org.apache.activemq.activemq-pool:5.5.1]
> > at
> >
> org.apache.activemq.pool.XaConnectionPool$Synchronization.afterCompletion(XaConnectionPool.java:90)[57:org.apache.activemq.activemq-pool:5.5.1]
> > at
> >
> org.apache.geronimo.transaction.manager.TransactionImpl.afterCompletion(TransactionImpl.java:540)[45:org.apache.aries.transaction.manager:0.3.0]
> > at
> >
> org.apache.geronimo.transaction.manager.TransactionImpl.afterCompletion(TransactionImpl.java:533)[45:org.apache.aries.transaction.manager:0.3.0]
> > at
> >
> org.apache.geronimo.transaction.manager.TransactionImpl.commit(TransactionImpl.java:329)[45:org.apache.aries.transaction.manager:0.3.0]
> > at
> >
> org.apache.geronimo.transaction.manager.TransactionManagerImpl.commit(TransactionManagerImpl.java:252)[45:org.apache.aries.transaction.manager:0.3.0]
> >
> >
> > Chris
> >
> > On Tue, Apr 17, 2012 at 9:44 AM, Raul Kripalani <r...@fusesource.com>
> wrote:
> >
> >> I noticed several things in your config.
> >>
> >> 1) the JMS config should be inside the 'configuration' property of the
> >> ActiveMQComponent:
> >>
> >> <!-- ActiveMQ JMS Configuration is defined as Transacted and leverages
> XA
> >> Transactions -->
> >> <bean id="activemq"
> >> class="org.apache.activemq.camel.component.ActiveMQComponent">
> >>    <property name="configuration">
> >>     <bean class="org.apache.camel.component.jms.JmsConfiguration">
> >>        <property name="connectionFactory"
> >> ref="pooledConnectionFactoryXa"/>
> >>        <property name="transactionManager" ref="platformTxManager" />
> >>        <property name="transacted" value="false"/>
> >>        <property name="cacheLevelName" value="CACHE_NONE"/>
> >>     </bean>
> >>  </property>
> >> </bean>
> >>
> >> 2) the 'transacted' property should be false as above, because you don't
> >> want the component to manage the transactions locally. The enrolment of
> >> resources and coordination of transaction will happen on the XA level.
> >>
> >> 3) you are missing the ActiveMQResourceManager, which needs an
> injection of
> >> a javax.transaction.TransactionManager, which in reality is the same as
> the
> >> PlatformTransactionManager, but you under a different interface
> >>
> >> See the following link for how your config should look like:
> >>
> >>
> https://github.com/FuseByExample/camel-persistence-part2/blob/master/route-one-tx-manager/src/main/resources/META-INF/spring/springConfig.xml
> >> .
> >>
> >> And of course, the route must be invoked from the same thread where the
> >> transaction is being started, and you cannot use the SEDA component for
> >> that. You must invoke it via a direct endpoint and I think
> >> requestBodyAndHeader(), but I'm not sure about this last point.
> >>
> >> Regards,
> >>
> >> *Raúl Kripalani*
> >> Principal Consultant | FuseSource Corp.
> >> r...@fusesource.com | fusesource.com <http://www.fusesource.com/>
> skype:
> >> raul.fuse | twitter: @raulvk <http://twitter.com/raulvk>,
> >> @fusenews<http://twitter.com/fusenews>
> >>
> >> <http://twitter.com/fusenews>
> >>
> >> On 17 April 2012 16:53, Chris Geer <ch...@cxtsoftware.com> wrote:
> >>
> >>> Raul,
> >>>
> >>> I gave that a shot but it actually made the problem worse.
> >>> ProducerTemplate.requestBodyAndHeader uses an InOut exchange pattern
> but
> >>> since I'm not sending responses it always fails (regardless of
> >> transaction)
> >>> with a timeout saying it didn't get a response. It also send the
> message
> >> to
> >>> the topic even without the transaction being committed so it wouldn't
> >> solve
> >>> the transaction problem anyway.
> >>>
> >>> Chris
> >>>
> >>> On Tue, Apr 17, 2012 at 1:47 AM, Raul Kripalani <r...@fusesource.com>
> >>> wrote:
> >>>
> >>>> Hi Chris!
> >>>>
> >>>> Transaction Managers bind transactions to threads, and a possible
> cause
> >>> for
> >>>> your transaction getting lost is that your route is being called
> >>>> asynchronously from another thread.
> >>>>
> >>>> This is because you are using ProducerTemplate.send...().
> >>>>
> >>>> Can you replace this with ProducerTemplate.requestBodyAndHeader(...),
> >>> which
> >>>> in theory should call the route synchronously in the same thread?
> >>>>
> >>>> Regards,
> >>>>
> >>>> *Raúl Kripalani*
> >>>> Principal Consultant | FuseSource Corp.
> >>>> r...@fusesource.com | fusesource.com <http://www.fusesource.com/>
> >> skype:
> >>>> raul.fuse | twitter: @raulvk <http://twitter.com/raulvk>,
> >>>> @fusenews<http://twitter.com/fusenews>
> >>>>
> >>>> <http://twitter.com/fusenews>
> >>>>
> >>>> On 16 April 2012 23:09, Chris Geer <ch...@cxtsoftware.com> wrote:
> >>>>
> >>>>> Claus,
> >>>>>
> >>>>> I'm still struggling with this so I've put together a quick sample
> >>>> project
> >>>>> that shows the problem. It consists of an OSGI component that runs
> >>> under
> >>>> a
> >>>>> transaction and posts two JMS messages (one with Camel and one with
> >> JMS
> >>>>> APIs) then rolls back the transactions. I would hope to see both
> >>> messages
> >>>>> not be delivered but instead what I see if the one sent via camel
> >> being
> >>>>> delivered while the other one is rolled back. I'm sure I'm probably
> >>> doing
> >>>>> something wrong but I can't figure it out.
> >>>>>
> >>>>> Is there a place I can post my sample project where someone might be
> >>> able
> >>>>> to give it a quick look?
> >>>>>
> >>>>> Thanks,
> >>>>> Chris
> >>>>>
> >>>>> On Sat, Apr 7, 2012 at 3:19 AM, Claus Ibsen <claus.ib...@gmail.com>
> >>>> wrote:
> >>>>>
> >>>>>> On Thu, Apr 5, 2012 at 5:57 PM, Chris Geer <ch...@cxtsoftware.com>
> >>>>> wrote:
> >>>>>>> Claus,
> >>>>>>>
> >>>>>>> I realize that but I can't explain what I'm seeing. Here is an
> >>>>> additional
> >>>>>>> piece of info, here is debug log for the sending of the message.
> >> As
> >>>> you
> >>>>>> can
> >>>>>>> see, the transaction fields are all null but I don't know if that
> >>> is
> >>>>>> normal
> >>>>>>> or a symptom of the problem.
> >>>>>>>
> >>>>>>> 08:51:22,906 | DEBUG | erations/address | JmsConfiguration
> >>>>>>> | 169 - org.apache.camel.camel-jms - 2.9.2.SNAPSHOT | Sending JMS
> >>>>> message
> >>>>>>> to: topic://event-notifications with message:
> >> ActiveMQBytesMessage
> >>>>>>> {commandId = 0, responseRequired = false, messageId = null,
> >>>>>>> originalDestination = null, originalTransactionId = null,
> >>> producerId
> >>>> =
> >>>>>>> null, destination = null, transactionId = null, expiration = 0,
> >>>>>> timestamp =
> >>>>>>> 0, arrival = 0, brokerInTime = 0, brokerOutTime = 0,
> >> correlationId
> >>> =
> >>>>>> null,
> >>>>>>> replyTo = null, persistent = true, type = null, priority = 0,
> >>>> groupID =
> >>>>>>> null, groupSequence = 0, targetConsumerId = null, compressed =
> >>> false,
> >>>>>>> userID = null, content = null, marshalledProperties = null,
> >>>>>> dataStructure =
> >>>>>>> null, redeliveryCounter = 0, size = 0, properties =
> >>>>> {EntityType=Address,
> >>>>>>> breadcrumbId=ID-CXTMBP-Chris-local-62052-1333577461603-22-3,
> >>>>>>> EventType=EntityCreated, ClientID=0}, readOnlyProperties = false,
> >>>>>>> readOnlyBody = false, droppable = false} ActiveMQBytesMessage{
> >>>>> bytesOut =
> >>>>>>> org.apache.activemq.util.ByteArrayOutputStream@51762faf,
> >> dataOut =
> >>>>>>> java.io.DataOutputStream@2634b3f1, dataIn = null }
> >>>>>>>
> >>>>>>
> >>>>>> I would only suspect transaction ids being populated in the AMQ
> >>>>>> message if the message originated from the AMQ broker. Creating a
> >> new
> >>>>>> message to be send would most likely not populate TX ids and
> >> whatnot.
> >>>>>> But the work is still carried out under the TX manager. (if TX is
> >>>>>> properly configured and working - yeah thats the hard part).
> >>>>>>
> >>>>>>> Here is more of the stack trace that shows the transaction being
> >>>>>> committed
> >>>>>>> for some reason.
> >>>>>>>
> >>>>>>> 08:51:22,888 | DEBUG | erations/address | TransactionErrorHandler
> >>>>>>> | 166 - org.apache.camel.camel-core - 2.9.2.SNAPSHOT |
> >> Transaction
> >>>>> begin
> >>>>>>> (0x1f2198ab) redelivered(unknown) for (MessageId:
> >>>>>>> ID-CXTMBP-Chris-local-62052-1333577461603-22-3 on ExchangeId:
> >>>>>>> ID-CXTMBP-Chris-local-62052-1333577461603-22-4))
> >>>>>>> 08:51:22,888 | DEBUG | erations/address | JtaTransactionManager
> >>>>>>> | 139 - org.springframework.transaction - 3.0.6.RELEASE |
> >>>>> Participating
> >>>>>> in
> >>>>>>> existing transaction
> >>>>>>> 08:51:22,906 | DEBUG | erations/address | JmsConfiguration
> >>>>>>> | 169 - org.apache.camel.camel-jms - 2.9.2.SNAPSHOT | Sending JMS
> >>>>> message
> >>>>>>> to: topic://event-notifications with message:
> >> ActiveMQBytesMessage
> >>>>>>> {commandId = 0, responseRequired = false, messageId = null,
> >>>>>>> originalDestination = null, originalTransactionId = null,
> >>> producerId
> >>>> =
> >>>>>>> null, destination = null, transactionId = null, expiration = 0,
> >>>>>> timestamp =
> >>>>>>> 0, arrival = 0, brokerInTime = 0, brokerOutTime = 0,
> >> correlationId
> >>> =
> >>>>>> null,
> >>>>>>> replyTo = null, persistent = true, type = null, priority = 0,
> >>>> groupID =
> >>>>>>> null, groupSequence = 0, targetConsumerId = null, compressed =
> >>> false,
> >>>>>>> userID = null, content = null, marshalledProperties = null,
> >>>>>> dataStructure =
> >>>>>>> null, redeliveryCounter = 0, size = 0, properties =
> >>>>> {EntityType=Address,
> >>>>>>> breadcrumbId=ID-CXTMBP-Chris-local-62052-1333577461603-22-3,
> >>>>>>> EventType=EntityCreated, ClientID=0}, readOnlyProperties = false,
> >>>>>>> readOnlyBody = false, droppable = false} ActiveMQBytesMessage{
> >>>>> bytesOut =
> >>>>>>> org.apache.activemq.util.ByteArrayOutputStream@51762faf,
> >> dataOut =
> >>>>>>> java.io.DataOutputStream@2634b3f1, dataIn = null }
> >>>>>>> 08:51:22,907 | DEBUG | erations/address | JtaTransactionManager
> >>>>>>> | 139 - org.springframework.transaction - 3.0.6.RELEASE |
> >>>> Registering
> >>>>>>> after-completion synchronization with existing JTA transaction
> >>>>>>> 08:51:22,907 | DEBUG | erations/address | TransactionErrorHandler
> >>>>>>> | 166 - org.apache.camel.camel-core - 2.9.2.SNAPSHOT |
> >> Transaction
> >>>>>> commit
> >>>>>>> (0x1f2198ab) redelivered(unknown) for (MessageId:
> >>>>>>> ID-CXTMBP-Chris-local-62052-1333577461603-22-3 on ExchangeId:
> >>>>>>> ID-CXTMBP-Chris-local-62052-1333577461603-22-4))
> >>>>>>>
> >>>>>>
> >>>>>> That last debug logging is just Camel saying that the TX completed
> >>>>>> successfully (in that leg). Its up to the TX manager when actually
> >> to
> >>>>>> commit the TX. If a TX was started outside, then the commit is
> >>>>>> executed at that point.
> >>>>>>
> >>>>>> So this is normal.
> >>>>>>
> >>>>>>> On Thu, Apr 5, 2012 at 8:19 AM, Claus Ibsen <
> >> claus.ib...@gmail.com
> >>>>
> >>>>>> wrote:
> >>>>>>>
> >>>>>>>> On Thu, Apr 5, 2012 at 4:59 PM, Chris Geer <
> >> ch...@cxtsoftware.com
> >>>>
> >>>>>> wrote:
> >>>>>>>>> Christian,
> >>>>>>>>>
> >>>>>>>>> I have that book and that is what I used for a lot of my
> >>>> reference.
> >>>>> In
> >>>>>>>>> fact, they only major difference between his source and mine
> >> is
> >>> he
> >>>>> is
> >>>>>>>> using
> >>>>>>>>> Atomikos as the transaction manager and I'm using aries. I am
> >>>>>> referencing
> >>>>>>>>> an existing PlatformTransactionManager instead of creating a
> >>>>>>>>> JtaTransactionManager but PlatformTransactionManager
> >> implements
> >>>>>>>>> JtaTransactionManager so it should be ok.
> >>>>>>>>>
> >>>>>>>>> As for the datasource, I'm actually publishing it from another
> >>>> OSGI
> >>>>>>>>> component as a service so it can be reused. I'm creating it in
> >>>> code
> >>>>>> right
> >>>>>>>>> now as defined below.
> >>>>>>>>>
> >>>>>>>>>       BasicManagedDataSource ds = new
> >> BasicManagedDataSource();
> >>>>>>>>>
> >>>>>>>>>       if(xaDataSourceClass != null &&
> >>>>> !xaDataSourceClass.isEmpty()) {
> >>>>>>>>>           try {
> >>>>>>>>>               XADataSource dsi =
> >>>>>>>>> (XADataSource)Class.forName(xaDataSourceClass).newInstance();
> >>>>>>>>>               Method setUrl =
> >>> dsi.getClass().getMethod("setUrl",
> >>>>> new
> >>>>>>>>> Class[] {String.class});
> >>>>>>>>>               setUrl.invoke(dsi, (String)
> >>>> config.get(CONNSTR_KEY));
> >>>>>>>>>               ds.setXADataSource(xaDataSourceClass);
> >>>>>>>>>               ds.setXaDataSourceInstance(dsi);
> >>>>>>>>>           } catch (IllegalArgumentException ex) {
> >>>>>>>>>               throw new
> >>>> ConfigurationException("xaDataSourceClass",
> >>>>>>>>> "Couldn't create instance", ex);
> >>>>>>>>>           } catch (InvocationTargetException ex) {
> >>>>>>>>>               throw new
> >>>> ConfigurationException("xaDataSourceClass",
> >>>>>>>>> "Couldn't create instance", ex);
> >>>>>>>>>           } catch (NoSuchMethodException ex) {
> >>>>>>>>>               throw new
> >>>> ConfigurationException("xaDataSourceClass",
> >>>>>>>>> "Couldn't create instance", ex);
> >>>>>>>>>           } catch (SecurityException ex) {
> >>>>>>>>>               throw new
> >>>> ConfigurationException("xaDataSourceClass",
> >>>>>>>>> "Couldn't create instance", ex);
> >>>>>>>>>           } catch (InstantiationException ex) {
> >>>>>>>>>               throw new
> >>>> ConfigurationException("xaDataSourceClass",
> >>>>>>>>> "Couldn't create instance", ex);
> >>>>>>>>>           } catch (IllegalAccessException ex) {
> >>>>>>>>>               throw new
> >>>> ConfigurationException("xaDataSourceClass",
> >>>>>>>>> "Couldn't create instance", ex);
> >>>>>>>>>           } catch (ClassNotFoundException ex) {
> >>>>>>>>>               throw new
> >>>> ConfigurationException("xaDataSourceClass",
> >>>>>>>>> "Class not found", ex);
> >>>>>>>>>           }
> >>>>>>>>>       } else {
> >>>>>>>>>           ds.setDriverClassName((String)
> >>> config.get(DRIVER_KEY));
> >>>>>>>>>           ds.setUrl((String) config.get(CONNSTR_KEY));
> >>>>>>>>>       }
> >>>>>>>>>
> >>>>>>>>>       BundleContext context =
> >>>>>>>>>
> >>>>>>>>
> >>>>>>
> >>>>>
> >>>>
> >>>
> >>
> FrameworkUtil.getBundle(BedrockConnectionPoolFactory.class).getBundleContext();
> >>>>>>>>>
> >>>>>>>>>       ds.setTransactionManager(transMgr);
> >>>>>>>>>
> >>>>>>>>>       Hashtable<String, String> sp = new Hashtable<String,
> >>>>> String>();
> >>>>>>>>>       sp.put(DSNAME_KEY, (String) config.get(DSNAME_KEY));
> >>>>>>>>>       ServiceRegistration reg =
> >>>>>>>>> context.registerService("javax.sql.XADataSource",
> >>>>>>>>> ds.getXaDataSourceInstance(), sp);
> >>>>>>>>>       regMap.put(id, reg);
> >>>>>>>>>
> >>>>>>>>> The transMgr variable above is looking up the Aries
> >> transaction
> >>>>>> manager
> >>>>>>>>> deployed in SMX (same one my JMS code is getting through the
> >>>>>>>>> PlatformTransactionManager interface).
> >>>>>>>>>
> >>>>>>>>> The biggest challenge I've had is that every single camel
> >>>>> transaction
> >>>>>>>>> example I've seen starts the transaction INSIDE camel. They
> >> all
> >>>>>> resemble
> >>>>>>>>> the diagram on page 300 of Claus' book. I haven't seen any
> >>> example
> >>>>>> where
> >>>>>>>>> camel is enlisted in an already existing transaction. I was
> >>> hoping
> >>>>>> that
> >>>>>>>> was
> >>>>>>>>> just because examples are traditionally simple but maybe it
> >>> wasn't
> >>>>>>>> designed
> >>>>>>>>> to do that?
> >>>>>>>>>
> >>>>>>>>
> >>>>>>>> Camel does not have its own TX manager etc. All we do is to hook
> >>>> into
> >>>>>>>> the Spring TX manager.
> >>>>>>>> So if there is already a TX in progress, then Camel should just
> >>> play
> >>>>>>>> along, and run in that same TX.
> >>>>>>>>
> >>>>>>>> The Camel processing occurs in a Spring TX template in its -
> >>>>>>>> doInTransaction method. That happens when you use the
> >> <transacted>
> >>>> in
> >>>>>>>> the Route.
> >>>>>>>>
> >>>>>>>>> Chris
> >>>>>>>>>
> >>>>>>>>> On Thu, Apr 5, 2012 at 1:11 AM, Christian Müller <
> >>>>>>>>> christian.muel...@gmail.com> wrote:
> >>>>>>>>>
> >>>>>>>>>> Chris,
> >>>>>>>>>> may be the source code of Claus book "Camel in Action" is
> >>> helpful
> >>>>> for
> >>>>>>>> you
> >>>>>>>>>> [1].
> >>>>>>>>>>
> >>>>>>>>>> Could you als share your datasource configuration with us? It
> >>> was
> >>>>>> not in
> >>>>>>>>>> your post...
> >>>>>>>>>>
> >>>>>>>>>> [1]
> >>>>>>>>>>
> >>>>>>>>>>
> >>>>>>>>
> >>>>>>
> >>>>>
> >>>>
> >>>
> >>
> http://code.google.com/p/camelinaction/source/browse/trunk/chapter9/xa/src/test/resources/spring-context.xml
> >>>>>>>>>>
> >>>>>>>>>> Best,
> >>>>>>>>>> Christian
> >>>>>>>>>>
> >>>>>>>>>> On Thu, Apr 5, 2012 at 7:13 AM, Chris Geer <
> >>>> ch...@cxtsoftware.com>
> >>>>>>>> wrote:
> >>>>>>>>>>
> >>>>>>>>>>> We are building an application using ServiceMix (CXF,
> >> Camel,
> >>>>>> Karaf...)
> >>>>>>>>>> and
> >>>>>>>>>>> we've run into an issue with transactions not propagating
> >> to
> >>>>> camel
> >>>>>>>> routes
> >>>>>>>>>>> as we'd like them to. We have several OSGI components that
> >>> run
> >>>>>> under
> >>>>>>>>>>> transactions using the Aries transaction management like
> >> the
> >>>>>>>> following:
> >>>>>>>>>>>
> >>>>>>>>>>>    <bean id="serviceBean" class="<class>">
> >>>>>>>>>>>       <property name="dataSource" ref="ds"/>
> >>>>>>>>>>>       <property name="camelContext" ref="camelCtx"/>
> >>>>>>>>>>>       <tx:transaction method="updateAddress,
> >> createAddress,
> >>>>>>>>>>> deleteAddress" value="Required" />
> >>>>>>>>>>>       <tx:transaction method="getAddress, findAddresses"
> >>>>>>>>>> value="Supports"
> >>>>>>>>>>> />
> >>>>>>>>>>>   </bean>
> >>>>>>>>>>>
> >>>>>>>>>>> We have published a DataSource which is transaction aware
> >> for
> >>>> our
> >>>>>>>>>>> components to use. It shows up in SMX as the following:
> >>>>>>>>>>>
> >>>>>>>>>>> aries.xa.aware = true
> >>>>>>>>>>> dsName = ds
> >>>>>>>>>>> objectClass = javax.sql.DataSource
> >>>>>>>>>>> service.id = 298
> >>>>>>>>>>>
> >>>>>>>>>>> In our components we are able to perform database
> >>> transactions
> >>>>> that
> >>>>>>>>>>> successfully get committed/rolled back as expected without
> >>>> having
> >>>>>> to
> >>>>>>>>>>> manually enlist the JDBC connection. It works great. Those
> >>> same
> >>>>>>>>>> components
> >>>>>>>>>>> also will send various JMS messages as they succeed/fail.
> >> Our
> >>>>> goal
> >>>>>> is
> >>>>>>>>>> that
> >>>>>>>>>>> if a component sends a JMS message on success and later
> >> rolls
> >>>>> back
> >>>>>> the
> >>>>>>>>>> JMS
> >>>>>>>>>>> message would be retracted. If we lookup a JMS
> >>>> ConnectionFactory,
> >>>>>>>> create
> >>>>>>>>>> a
> >>>>>>>>>>> connection, session, manually enlist the session into the
> >>>> current
> >>>>>>>>>>> transaction and send the message all in code it actually
> >>> works
> >>>> as
> >>>>>>>>>> desired.
> >>>>>>>>>>>
> >>>>>>>>>>> What we hope to be able to do however is to remove the code
> >>> and
> >>>>> use
> >>>>>>>> camel
> >>>>>>>>>>> instead to process the message and pass it along to the JMS
> >>>>> topic,
> >>>>>> in
> >>>>>>>> the
> >>>>>>>>>>> same transaction that the OSGI component is running in but
> >> we
> >>>>> can't
> >>>>>>>> quite
> >>>>>>>>>>> get it to work. Below is our latest configuration and code
> >>> and
> >>>> at
> >>>>>> this
> >>>>>>>>>>> point the message posts to the topic but never rolls back.
> >>>>>>>>>>>
> >>>>>>>>>>> Blueprint File
> >>>>>>>>>>>   <bean id="activemq"
> >>>>>>>>>>>
> >>> class="org.apache.activemq.camel.component.ActiveMQComponent">
> >>>>>>>>>>>       <property name="connectionFactory"
> >>>>>>>> ref="jmsXaConnectionFactory"/>
> >>>>>>>>>>>       <property name="transacted" value="true"/>
> >>>>>>>>>>>       <property name="transactionManager"
> >>>>>>>> ref="jmsTransactionManager"/>
> >>>>>>>>>>>   </bean>
> >>>>>>>>>>>
> >>>>>>>>>>>   <bean id="mandatory"
> >>>>>>>>>>>
> >> class="org.apache.camel.spring.spi.SpringTransactionPolicy">
> >>>>>>>>>>>       <property name="transactionManager"
> >>>>>>>> ref="jmsTransactionManager"/>
> >>>>>>>>>>>       <property name="propagationBehaviorName"
> >>>>>>>>>>> value="PROPAGATION_MANDATORY"/>
> >>>>>>>>>>>   </bean>
> >>>>>>>>>>>
> >>>>>>>>>>>   <bean id="jmsXaConnectionFactory"
> >>>>>>>>>>>
> >>>> class="org.apache.activemq.ActiveMQXAConnectionFactory">
> >>>>>>>>>>>       <property name="brokerURL"
> >>>> value="tcp://localhost:61616"/>
> >>>>>>>>>>>   </bean>
> >>>>>>>>>>>
> >>>>>>>>>>>   <reference id="jmsTransactionManager"
> >>>>>>>>>>>
> >>>>>>>>
> >>>>>
> >>>
> interface="org.springframework.transaction.PlatformTransactionManager"/>
> >>>>>>>>>>>
> >>>>>>>>>>>
> >>>>>>>>>>>   <camel:camelContext id="camelCtx" trace="true">
> >>>>>>>>>>>       <camel:route>
> >>>>>>>>>>>           <camel:from uri="direct:genEvent"/>
> >>>>>>>>>>>           <camel:wireTap uri="direct:wireTap"/>
> >>>>>>>>>>>           <camel:transacted ref="mandatory"/>
> >>>>>>>>>>>           <camel:to
> >>> uri="activemq:topic:event-notifications"/>
> >>>>>>>>>>>       </camel:route>
> >>>>>>>>>>>
> >>>>>>>>>>>       <camel:route>
> >>>>>>>>>>>           <camel:from uri="direct:wireTap"/>
> >>>>>>>>>>>           <camel:to uri="log:logger?showAll=true"/>
> >>>>>>>>>>>       </camel:route>
> >>>>>>>>>>>   </camel:camelContext>
> >>>>>>>>>>>
> >>>>>>>>>>> Code:
> >>>>>>>>>>>
> >>>>>>>>>>>       ProducerTemplate pt =
> >>> camelCtx.createProducerTemplate();
> >>>>>>>>>>>
> >>>>>>>>>>>       Map<String, Object> headers = new HashMap<String,
> >>>>> Object>();
> >>>>>>>>>>>       headers.put("EventType", eventType);
> >>>>>>>>>>>       headers.put("ClientID", 0);
> >>>>>>>>>>>       headers.put("EntityType", "Address");
> >>>>>>>>>>>
> >>>>>>>>>>>       pt.sendBodyAndHeaders("direct:genEvent",
> >>>>>> getAddress(addressID),
> >>>>>>>>>>> headers);
> >>>>>>>>>>>
> >>>>>>>>>>>
> >>>>>>>>>>> Like I mentioned, the code all works in the success case
> >> but
> >>>>>> doesn't
> >>>>>>>>>>> rollback the JMS message in the failure case. Apparently
> >> the
> >>>>>>>> transaction
> >>>>>>>>>>> context isn't being passed on to the camel route even
> >> though
> >>>> it's
> >>>>>>>> using
> >>>>>>>>>> the
> >>>>>>>>>>> same transaction manager under the covers. Is that by
> >> design
> >>> or
> >>>>> is
> >>>>>>>> there
> >>>>>>>>>> a
> >>>>>>>>>>> way to make this scenario work? We'd really like to be able
> >>> use
> >>>>> the
> >>>>>>>> camel
> >>>>>>>>>>> route approach so we can do more complex things than what I
> >>>> show
> >>>>>> here.
> >>>>>>>>>>>
> >>>>>>>>>>> Thanks,
> >>>>>>>>>>> Chris
> >>>>>>>>>>>
> >>>>>>>>>>
> >>>>>>>>
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> --
> >>>>>>>> Claus Ibsen
> >>>>>>>> -----------------
> >>>>>>>> CamelOne 2012 Conference, May 15-16, 2012: http://camelone.com
> >>>>>>>> FuseSource
> >>>>>>>> Email: cib...@fusesource.com
> >>>>>>>> Web: http://fusesource.com
> >>>>>>>> Twitter: davsclaus, fusenews
> >>>>>>>> Blog: http://davsclaus.blogspot.com/
> >>>>>>>> Author of Camel in Action: http://www.manning.com/ibsen/
> >>>>>>>>
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>> --
> >>>>>> Claus Ibsen
> >>>>>> -----------------
> >>>>>> CamelOne 2012 Conference, May 15-16, 2012: http://camelone.com
> >>>>>> FuseSource
> >>>>>> Email: cib...@fusesource.com
> >>>>>> Web: http://fusesource.com
> >>>>>> Twitter: davsclaus, fusenews
> >>>>>> Blog: http://davsclaus.blogspot.com/
> >>>>>> Author of Camel in Action: http://www.manning.com/ibsen/
> >>>>>>
> >>>>>
> >>>>
> >>>
> >>
>

Reply via email to