You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@servicemix.apache.org by David Holroyd <da...@badgers-in-foil.co.uk> on 2007/11/01 01:18:41 UTC

Re: Handling unreliable binding components

On Tue, Oct 30, 2007 at 12:32:06AM +0000, David Holroyd wrote:

> I've done the above, but so far, I've not got any of the reliability I
> want.  Hunting around in the list archives, it looks like the way to do
> this would be to have the BC rollback any current transaction on
> failure, but I'm not sure how to make the JMS stuff be transacted.

I see this example referenced from the servicemix-jms docs,

  http://svn.apache.org/viewvc/incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/test/resources/org/apache/servicemix/jms/spring-jca.xml?revision=HEAD

but this seems to be a configuration for an embedded servicemix, rather
than something I can plonk into my SU xbean.xml (?)

I tried a bit of cut'n'paste in the dark, but the result is no messages
arriving at the Binding Component any more, and no errors logged
anywhere.

Is it reasonable / possible to enable transacted JCA processing in a
service unit's xbean.xml, or will this only be possible by 'static
configuration' (if I understand the term correctly)?


ta!
dave

-- 
http://david.holroyd.me.uk/

Solved: Handling unreliable binding components

Posted by David Holroyd <da...@badgers-in-foil.co.uk>.
On Thu, Nov 01, 2007 at 10:14:57PM +0000, David Holroyd wrote:
> On Thu, Nov 01, 2007 at 12:18:41AM +0000, David Holroyd wrote:
> > I see this example referenced from the servicemix-jms docs,
> > 
> >   http://svn.apache.org/viewvc/incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/test/resources/org/apache/servicemix/jms/spring-jca.xml?revision=HEAD
> > 
> > but this seems to be a configuration for an embedded servicemix, rather
> > than something I can plonk into my SU xbean.xml (?)

> I see that the underlying cause is,
> 
>   java.lang.IllegalStateException: Cannot log transactions unles
>   XAResources are named!

So after googling this a bit more, I saw this issue,

  https://issues.apache.org/activemq/browse/SM-778

and reading the diff prompted me to use synchronous="true" on the JMS
endpoint.  This seems to make things work much better!

I also changed my xbean.xml to use refs to things in JNDI, rather than
constructing new beans in the SU (required some additions to the
servicemix conf/jndi.xml).

This is my xbean.xml now, for reference,

----8<----
<beans xmlns:clientsupplier="urn:client:supplier"
       xmlns:jms="http://servicemix.apache.org/jms/1.0"
       xmlns:jencks="http://jencks.org/2.0"
       xmlns:amqra="http://activemq.org/ra/1.0"
       xmlns:jee="http://www.springframework.org/schema/jee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

  <jms:endpoint service="clientsupplier:jms"
                endpoint="endpoint"
                targetService="clientsupplier:service"
                defaultMep="http://www.w3.org/2004/08/wsdl/in-only"
                role="consumer"
                destinationStyle="queue"
                processorName="jca"
                bootstrapContext="#bootstrapContext"
                connectionFactory="#connectionFactory"
                resourceAdapter="#resourceAdapter"
                synchronous="true">
    <jms:activationSpec>
       <amqra:activationSpec destination="supplier/subscribe"
                             destinationType="javax.jms.Queue"/>
    </jms:activationSpec>
  </jms:endpoint>

  <jee:jndi-lookup id="resourceAdapter"
                   jndi-name="java:comp/env/smx/ResourceAdapter"/>
  <jee:jndi-lookup id="connectionFactory"
                   jndi-name="java:comp/env/smx/ConnectionFactory"/>
  <jee:jndi-lookup id="bootstrapContext"
                   jndi-name="java:comp/env/smx/BootstrapContext"/>
</beans>
---->8----


ta,
dave

-- 
http://david.holroyd.me.uk/

Re: Handling unreliable binding components

Posted by David Holroyd <da...@badgers-in-foil.co.uk>.
On Thu, Nov 01, 2007 at 12:18:41AM +0000, David Holroyd wrote:
> On Tue, Oct 30, 2007 at 12:32:06AM +0000, David Holroyd wrote:
> 
> > I've done the above, but so far, I've not got any of the reliability I
> > want.  Hunting around in the list archives, it looks like the way to do
> > this would be to have the BC rollback any current transaction on
> > failure, but I'm not sure how to make the JMS stuff be transacted.
> 
> I see this example referenced from the servicemix-jms docs,
> 
>   http://svn.apache.org/viewvc/incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/test/resources/org/apache/servicemix/jms/spring-jca.xml?revision=HEAD
> 
> but this seems to be a configuration for an embedded servicemix, rather
> than something I can plonk into my SU xbean.xml (?)
> 
> I tried a bit of cut'n'paste in the dark, but the result is no messages
> arriving at the Binding Component any more, and no errors logged
> anywhere.


So I enabled DEBUG loggin for "org.apache.activemq", and see,

  INFO  - ServerSessionImpl:2            - Endpoint failed to process
  message. Reason: java.lang.RuntimeException: Endpoint after delivery
  notification failure

running in the debugger, I see that the underlying cause is,

  java.lang.IllegalStateException: Cannot log transactions unles
  XAResources are named!
  org.apache.activemq.ra.LocalAndXATransaction@1b10e9e

this happens over here,

  org.apache.geronimo.transaction.manager.TransactionImpl$TransactionBranch.getResourceName(TransactionImpl.java:716)
  org.apache.geronimo.transaction.log.HOWLLog.prepare(HOWLLog.java:254)
  org.apache.geronimo.transaction.manager.TransactionImpl.internalPrepare(TransactionImpl.java:443)
  org.apache.geronimo.transaction.manager.TransactionImpl.commit(TransactionImpl.java:315)
  org.apache.geronimo.transaction.manager.TransactionManagerImpl.commit(TransactionManagerImpl.java:264)
  org.jencks.XAEndpoint.afterDelivery(XAEndpoint.java:105)


Any simple way to make it happy?


Here is my xbean.xml,

<beans xmlns:custsupplier="urn:cust:supplier"
       xmlns:jms="http://servicemix.apache.org/jms/1.0"
       xmlns:jencks="http://jencks.org/2.0"
       xmlns:amqra="http://activemq.org/ra/1.0"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

  <jms:endpoint service="custsupplier:jms"
                endpoint="endpoint"
                targetService="custsupplier:service"
                defaultMep="http://www.w3.org/2004/08/wsdl/in-only"
                role="consumer"
                destinationStyle="queue"
                processorName="jca"
                bootstrapContext="#bootstrapContext"
                connectionFactory="#connectionFactory"
                resourceAdapter="#resourceAdapter"
                synchronous="false">
  <jms:activationSpec>
     <amqra:activationSpec destination="supplier/subscribe"
                           destinationType="javax.jms.Queue" />
  </jms:activationSpec>


  </jms:endpoint>

  <amqra:managedConnectionFactory id="activemqMCF"
                                  resourceAdapter="#resourceAdapter"/>
  <amqra:resourceAdapter id="resourceAdapter"
                         serverUrl="tcp://127.0.0.1:61616?jms.asyncDispatch=true&amp;jms.useAsyncSend=true"/>
  <jencks:connectionFactory  id="connectionFactory"
                             managedConnectionFactory="#activemqMCF"
                             connectionManager="#connectionManager" />

  <!-- Transaction manager -->
  <jencks:transactionManager id="transactionManager"/>

  <!-- Work manager -->
  <jencks:workManager id="workManager"
                      transactionManager="#transactionManager"/>
  
  <!-- Bootstrap context for JCA -->
  <jencks:bootstrapContext id="bootstrapContext"
                           workManager="#workManager"
                           transactionManager="#transactionManager"/>
  
  <!-- Connection manager for JCA -->
  <jencks:connectionTracker id="connectionTracker"
                            geronimoTransactionManager="#transactionManager"/>
  <jencks:poolingSupport id="poolingSupport"
                         allConnectionsEqual="false"/>
  <jencks:connectionManager id="connectionManager"
                            containerManagedSecurity="false"
                            transaction="xa"
                            transactionManager="#transactionManager"
                            poolingSupport="#poolingSupport"
                            connectionTracker="#connectionTracker"/>

</beans>



ta much!
dave

-- 
http://david.holroyd.me.uk/