Return-Path: X-Original-To: apmail-camel-dev-archive@www.apache.org Delivered-To: apmail-camel-dev-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id BA4C7107D9 for ; Sat, 19 Oct 2013 07:23:31 +0000 (UTC) Received: (qmail 12785 invoked by uid 500); 19 Oct 2013 07:23:23 -0000 Delivered-To: apmail-camel-dev-archive@camel.apache.org Received: (qmail 12718 invoked by uid 500); 19 Oct 2013 07:23:15 -0000 Mailing-List: contact dev-help@camel.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@camel.apache.org Delivered-To: mailing list dev@camel.apache.org Received: (qmail 12707 invoked by uid 99); 19 Oct 2013 07:23:13 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 19 Oct 2013 07:23:13 +0000 X-ASF-Spam-Status: No, hits=0.6 required=5.0 tests=RCVD_IN_DNSWL_LOW,SPF_PASS,URI_HEX X-Spam-Check-By: apache.org Received-SPF: pass (nike.apache.org: domain of claus.ibsen@gmail.com designates 209.85.223.174 as permitted sender) Received: from [209.85.223.174] (HELO mail-ie0-f174.google.com) (209.85.223.174) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 19 Oct 2013 07:23:07 +0000 Received: by mail-ie0-f174.google.com with SMTP id qd12so8097845ieb.5 for ; Sat, 19 Oct 2013 00:22:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :content-type; bh=IuoHvVRftN6m0Q8SR/b3XRiRskBFriwuY39QggFJT5o=; b=nm9ZMia92Hs6YhMbfjG3BR02MDrW1Pepc6OLoOsxkgqsot2iUosldQ899FtKY89S0u yxYj7DqcBHVBZCUsfEMjim+EVt8NgMCcRqvmulI1qJ/8OhFX4Uueqk2IHl6AeBGRC4q8 UzwF7yJhRjUbLeZqHks0iL7Fgn04oKvYhaqCZB5yoOyV2FNQaGC4PKNkbQuFvbvyaAJP u1iOh12s0exEfK0AgaqJ9czCZZiHLym3oMpI5UTWP2bRFJdgFlBqDcyYvoMOoShwW8pB uR16xVWExrqx9H61+JrjM4pj43m3Vyt37wHvjbeCH45S/65OEQFf151tZ3OW04HTTNXB qdbw== X-Received: by 10.50.39.84 with SMTP id n20mr2445192igk.14.1382167366314; Sat, 19 Oct 2013 00:22:46 -0700 (PDT) MIME-Version: 1.0 Received: by 10.64.168.38 with HTTP; Sat, 19 Oct 2013 00:22:26 -0700 (PDT) In-Reply-To: <1382142604706-5741876.post@n5.nabble.com> References: <1381512135506-5741367.post@n5.nabble.com> <1381565112229-5741403.post@n5.nabble.com> <1381612075714-5741448.post@n5.nabble.com> <1381745264494-5741510.post@n5.nabble.com> <1382132832289-5741864.post@n5.nabble.com> <1382142604706-5741876.post@n5.nabble.com> From: Claus Ibsen Date: Sat, 19 Oct 2013 09:22:26 +0200 Message-ID: Subject: Re: Build failures... To: dev Content-Type: text/plain; charset=ISO-8859-1 X-Virus-Checked: Checked by ClamAV on apache.org Nice digging Babak. On Sat, Oct 19, 2013 at 2:30 AM, Babak Vahdat wrote: > Christian, > > I commited fix for this both on the master as well as the 2.12.x branch. > Would you please give it another try to see if you can still reproduce the > test failures you mentioned by your previous posts? > > Babak > > > Christian Mueller wrote >> Really good catch! >> >> Best, >> >> Christian >> ----------------- >> >> Software Integration Specialist >> >> Apache Member >> V.P. Apache Camel | Apache Camel PMC Member | Apache Camel committer >> Apache Incubator PMC Member >> >> https://www.linkedin.com/pub/christian-mueller/11/551/642 >> >> >> On Fri, Oct 18, 2013 at 11:47 PM, Babak Vahdat >> < > >> babak.vahdat@ > >> >wrote: >> >>> The root cause of the problem for the failing JPA test is CAMEL-5932 >>> through >>> which we started sharing the *same* EntityManager object across >>> JpaEndpoint, >>> all it's created producers and consumers which is wrong! JPA 2.0 Spec, >>> section 7.2: >>> >>> An entity manager must not be shared among multiple concurrently >>> executing >>> threads, as the entity manager and persistence context are not required >>> to >>> be threadsafe. Entity managers must only be accessed in a single-threaded >>> manner. >>> >>> That said using OpenJPA you could make use of a proprietary property to >>> make >>> OpenJPA EntityManager-impl thread safe: >>> >>> >> >>> >>> But even then, what about Camel users whose JPA provider is Eclipselink >>> or >>> Hibernate-EntityManager. >>> >>> I logged a ticket to get this fixed and hopfully the JPA test being >>> mentioned here as well: >>> >>> https://issues.apache.org/jira/browse/CAMEL-6874 >>> >>> Also there're also some aimless lines of code inside >>> JpaProducer#process() >>> method which I will clean up as well. >>> >>> Babak >>> >>> >>> Babak Vahdat wrote >>> > Yeah you're right the test failed again on the CI-Server as well. >>> There're >>> > also couple of unresolved concurrency/deadlock related JIRA tickets by >>> > OpenJPA going into the exactly same direction: >>> > >>> > https://issues.apache.org/jira/browse/OPENJPA-1716 >>> > >>> > Babak >>> > Christian Mueller wrote >>> >> It's still failing sometimes on my machine: :-( >>> >> >>> >> Results : >>> >> Failed tests: >>> >> >>> >> >>> JpaProducerConcurrentTest.testConcurrentProducers:45->doSendMessages:66->CamelTestSupport.assertMockEndpointsSatisfied:682 >>> >> mock://result Received message count. Expected: <10> but was: <8> >>> >> >>> >> Tests run: 49, Failures: 1, Errors: 0, Skipped: 0 >>> >> >>> >> [INFO] >>> >> >>> ------------------------------------------------------------------------ >>> >> [INFO] BUILD FAILURE >>> >> [INFO] >>> >> >>> ------------------------------------------------------------------------ >>> >> >>> >> >>> >> Best, >>> >> Christian >>> >> ----------------- >>> >> >>> >> Software Integration Specialist >>> >> >>> >> Apache Member >>> >> V.P. Apache Camel | Apache Camel PMC Member | Apache Camel committer >>> >> Apache Incubator PMC Member >>> >> >>> >> https://www.linkedin.com/pub/christian-mueller/11/551/642 >>> >> >>> >> >>> >> On Sat, Oct 12, 2013 at 11:07 PM, Babak Vahdat >>> >> < >>> >>> >> babak.vahdat@ >>> >>> >> >wrote: >>> >> >>> >>> Yeah indeed a deadlock inside the OpenJPA code is the root cause of >>> the >>> >>> problem (org.apache.openjpa.kernel.BrokerImpl#lock()). I just >>> commited >>> a >>> >>> fix >>> >>> regarding this, so let's keep an eye on this test by the next builds. >>> >>> Following a screenshot of the proven deadlock through jconsole: >>> >>> >>> >>> < >>> >>> >>> http://camel.465427.n5.nabble.com/file/n5741448/Screen_Shot_2013-10-12_at_11.02.58_PM.png >>> >>> > >>> >>> >>> >>> You can enforce the deadlock if you would make use of a high log >>> level >>> >>> (log4j.properties), e.g. TRACE instead of just INFO. >>> >>> >>> >>> Babak >>> >>> >>> >>> >>> >>> Claus Ibsen-2 wrote >>> >>> > It could be due an OpenJPA upgrade. These tests used to work better >>> in >>> >>> the >>> >>> > past. >>> >>> > >>> >>> > On Sat, Oct 12, 2013 at 10:05 AM, Babak Vahdat >>> >>> > < >>> >>> >>> >>> > babak.vahdat@ >>> >>> >>> >>> > > wrote: >>> >>> >> The test failed again on the CI-Server. I will look into this in >>> the >>> >>> next >>> >>> >> days to see if I can find the root cause as on my box I can't >>> >>> reproduce >>> >>> >> this. >>> >>> >> >>> >>> >> Babak >>> >>> >> >>> >>> >> >>> >>> >> Babak Vahdat wrote >>> >>> >>> Hi >>> >>> >>> >>> >>> >>> @Christian I believe I've fixed the JPA test now, could you >>> please >>> >>> check >>> >>> >>> to see if you can still reproduce the same exception you >>> mentioned >>> >>> >>> below? >>> >>> >>> >>> >>> >>> Babak >>> >>> >>> Christian Mueller wrote >>> >>> >>>> Today, it looks much better [1]. We are trying to fix the unit >>> >>> tests >>> >>> >>>> which >>> >>> >>>> are failing from time to time on slower boxes. But this isn't so >>> >>> easy >>> >>> >>>> for >>> >>> >>>> all of them... >>> >>> >>>> >>> >>> >>>> I had a look at >>> >>> >>>> >>> >>> >>> org.apache.camel.processor.jpa.JpaProducerConcurrentTest.testConcurrentProducers. >>> >>> >>>> A few times I get the following exception which results in >>> missing >>> >>> >>>> exchanges in the mock:result endpoint: >>> >>> >>>> >>> >>> >>>> 2013-10-11 14:01:10,623 [pool-2-thread-2] ERROR >>> >>> >>>> DefaultErrorHandler - Failed delivery for (MessageId: >>> >>> >>>> ID-christians-macbook-pro-fritz-box-54975-1381492869188-0-4 on >>> >>> >>>> ExchangeId: >>> >>> >>>> ID-christians-macbook-pro-fritz-box-54975-1381492869188-0-9). >>> >>> Exhausted >>> >>> >>>> after delivery attempt: 1 caught: >>> >>> >>>> org.springframework.dao.InvalidDataAccessApiUsageException: This >>> >>> >>>> operation >>> >>> >>>> cannot be performed while a Transaction is active.; nested >>> >>> exception >>> >>> is >>> >>> >>>> >>> >>> > >>> >> >> >>> >>> >>>> org.apache.openjpa.persistence.InvalidStateException: This >>> >>> operation >>> >>> >>>> cannot >>> >>> >>>> be performed while a Transaction is active. >>> >>> >>>> >>> >>> >>>> Message History >>> >>> >>>> >>> >>> >>> --------------------------------------------------------------------------------------------------------------------------------------- >>> >>> >>>> RouteId ProcessorId >>> >>> >>>> Processor >>> >>> >>>> Elapsed (ms) >>> >>> >>>> [route1 ] [route1 ] >>> >>> >>>> [direct://start >>> >>> >>>> ] [ 68] >>> >>> >>>> [route1 ] [to1 ] >>> >>> >>>> [jpa://org.apache.camel.examples.SendEmail >>> >>> >>>> ] [ 67] >>> >>> >>>> >>> >>> >>>> Exchange >>> >>> >>>> >>> >>> >>> --------------------------------------------------------------------------------------------------------------------------------------- >>> >>> >>>> Exchange[ >>> >>> >>>> Id >>> >>> >>>> ID-christians-macbook-pro-fritz-box-54975-1381492869188-0-9 >>> >>> >>>> ExchangePattern InOnly >>> >>> >>>> Headers >>> >>> >>>> >>> >>> >>> {breadcrumbId=ID-christians-macbook-pro-fritz-box-54975-1381492869188-0-4, >>> >>> >>>> >>> >>> >>> CamelEntityManager=org.apache.openjpa.persistence.EntityManagerImpl@6e453dd5 >>> >>> , >>> >>> >>>> CamelRedelivered=false, CamelRedeliveryCounter=0} >>> >>> >>>> BodyType org.apache.camel.examples.SendEmail >>> >>> >>>> Body SendEmail[id: 102 address: null] >>> >>> >>>> ] >>> >>> >>>> >>> >>> >>>> Stacktrace >>> >>> >>>> >>> >>> >>> --------------------------------------------------------------------------------------------------------------------------------------- >>> >>> >>>> org.springframework.dao.InvalidDataAccessApiUsageException: This >>> >>> >>>> operation >>> >>> >>>> cannot be performed while a Transaction is active.; nested >>> >>> exception >>> >>> is >>> >>> >>>> >>> >>> > >>> >> >> >>> >>> >>>> org.apache.openjpa.persistence.InvalidStateException: This >>> >>> operation >>> >>> >>>> cannot >>> >>> >>>> be performed while a Transaction is active. >>> >>> >>>> at >>> >>> >>>> >>> >>> >>> org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:293) >>> >>> >>>> at >>> >>> >>>> >>> >>> >>> org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerSynchronization.convertException(ExtendedEntityManagerCreator.java:501) >>> >>> >>>> at >>> >>> >>>> >>> >>> >>> org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerSynchronization.afterCommit(ExtendedEntityManagerCreator.java:482) >>> >>> >>>> at >>> >>> >>>> >>> >>> >>> org.springframework.transaction.support.TransactionSynchronizationUtils.invokeAfterCommit(TransactionSynchronizationUtils.java:133) >>> >>> >>>> at >>> >>> >>>> >>> >>> >>> org.springframework.transaction.support.TransactionSynchronizationUtils.triggerAfterCommit(TransactionSynchronizationUtils.java:121) >>> >>> >>>> at >>> >>> >>>> >>> >>> >>> org.springframework.transaction.support.AbstractPlatformTransactionManager.triggerAfterCommit(AbstractPlatformTransactionManager.java:951) >>> >>> >>>> at >>> >>> >>>> >>> >>> >>> org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:797) >>> >>> >>>> at >>> >>> >>>> >>> >>> >>> org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:724) >>> >>> >>>> at >>> >>> >>>> >>> >>> >>> org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:148) >>> >>> >>>> at >>> >>> >>>> >>> >>> >>> org.apache.camel.component.jpa.JpaProducer.process(JpaProducer.java:53) >>> >>> >>>> at >>> >>> >>>> >>> >>> >>> org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61) >>> >>> >>>> at >>> >>> >>>> >>> >>> >>> org.apache.camel.processor.SendProcessor$2.doInAsyncProducer(SendProcessor.java:132) >>> >>> >>>> at >>> >>> >>>> >>> >>> >>> org.apache.camel.impl.ProducerCache.doInAsyncProducer(ProducerCache.java:307) >>> >>> >>>> at >>> >>> >>>> >>> >>> >>> org.apache.camel.processor.SendProcessor.process(SendProcessor.java:127) >>> >>> >>>> at >>> >>> >>>> >>> >>> >>> org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:398) >>> >>> >>>> at >>> >>> >>>> >>> >>> >>> org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191) >>> >>> >>>> at >>> >>> org.apache.camel.processor.Pipeline.process(Pipeline.java:118) >>> >>> >>>> at >>> >>> org.apache.camel.processor.Pipeline.process(Pipeline.java:80) >>> >>> >>>> at >>> >>> >>>> >>> >>> >>> org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191) >>> >>> >>>> at >>> >>> >>>> >>> >>> >>> org.apache.camel.component.direct.DirectProducer.process(DirectProducer.java:56) >>> >>> >>>> at >>> >>> >>>> >>> >>> >>> org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191) >>> >>> >>>> at >>> >>> >>>> >>> >>> >>> org.apache.camel.processor.UnitOfWorkProducer.process(UnitOfWorkProducer.java:73) >>> >>> >>>> at >>> >>> >>>> >>> >>> >>> org.apache.camel.impl.ProducerCache$2.doInProducer(ProducerCache.java:378) >>> >>> >>>> at >>> >>> >>>> >>> >>> >>> org.apache.camel.impl.ProducerCache$2.doInProducer(ProducerCache.java:1) >>> >>> >>>> at >>> >>> >>>> >>> >>> >>> org.apache.camel.impl.ProducerCache.doInProducer(ProducerCache.java:242) >>> >>> >>>> at >>> >>> >>>> >>> >>> >>> org.apache.camel.impl.ProducerCache.sendExchange(ProducerCache.java:346) >>> >>> >>>> at >>> >>> org.apache.camel.impl.ProducerCache.send(ProducerCache.java:184) >>> >>> >>>> at >>> >>> >>>> >>> >>> >>> org.apache.camel.impl.DefaultProducerTemplate.send(DefaultProducerTemplate.java:124) >>> >>> >>>> at >>> >>> >>>> >>> >>> >>> org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:137) >>> >>> >>>> at >>> >>> >>>> >>> >>> >>> org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:144) >>> >>> >>>> at >>> >>> >>>> >>> >>> >>> org.apache.camel.processor.jpa.JpaProducerConcurrentTest$1.call(JpaProducerConcurrentTest.java:58) >>> >>> >>>> at >>> >>> >>>> >>> java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) >>> >>> >>>> at java.util.concurrent.FutureTask.run(FutureTask.java:138) >>> >>> >>>> at >>> >>> >>>> >>> >>> >>> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895) >>> >>> >>>> at >>> >>> >>>> >>> >>> >>> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918) >>> >>> >>>> at java.lang.Thread.run(Thread.java:680) >>> >>> >>>> Caused by: >>> >>> >>>> >>> >>> > >>> >> >> >>> >>> >>>> org.apache.openjpa.persistence.InvalidStateException: This >>> >>> operation >>> >>> >>>> cannot >>> >>> >>>> be performed while a Transaction is active. >>> >>> >>>> at >>> >>> org.apache.openjpa.kernel.BrokerImpl.begin(BrokerImpl.java:1369) >>> >>> >>>> at >>> >>> >>>> >>> >>> >>> org.apache.openjpa.kernel.DelegatingBroker.begin(DelegatingBroker.java:925) >>> >>> >>>> at >>> >>> >>>> >>> >>> >>> org.apache.openjpa.persistence.EntityManagerImpl.begin(EntityManagerImpl.java:565) >>> >>> >>>> at >>> >>> >>>> >>> >>> >>> org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.enlistInCurrentTransaction(ExtendedEntityManagerCreator.java:422) >>> >>> >>>> at >>> >>> >>>> >>> >>> >>> org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.doJoinTransaction(ExtendedEntityManagerCreator.java:399) >>> >>> >>>> at >>> >>> >>>> >>> >>> >>> org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:351) >>> >>> >>>> at com.sun.proxy.$Proxy18.joinTransaction(Unknown Source) >>> >>> >>>> at >>> >>> >>>> >>> >>> >>> org.apache.camel.component.jpa.JpaProducer$1.doInTransaction(JpaProducer.java:55) >>> >>> >>>> at >>> >>> >>>> >>> >>> >>> org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:131) >>> >>> >>>> ... 27 more >>> >>> >>>> >>> >>> >>>> which is throwing from the line 55 in >>> >>> >>>> org.apache.camel.component.jpa.JpaProducer >>> >>> >>>> entityManager.joinTransaction(); >>> >>> >>>> >>> >>> >>>> I think this is a concurrency issue we have to investigate (not >>> >>> sure >>> >>> >>>> whether the issue is in Camel, Spring, OpenJPA, ...). Will open >>> a >>> >>> JIRA >>> >>> >>>> for >>> >>> >>>> it. >>> >>> >>>> >>> >>> >>>> [1] https://builds.apache.org/job/Camel.trunk.fulltest/1562/ >>> >>> >>>> >>> >>> >>>> Best, >>> >>> >>>> >>> >>> >>>> Christian >>> >>> >>>> ----------------- >>> >>> >>>> >>> >>> >>>> Software Integration Specialist >>> >>> >>>> >>> >>> >>>> Apache Member >>> >>> >>>> V.P. Apache Camel | Apache Camel PMC Member | Apache Camel >>> >>> committer >>> >>> >>>> Apache Incubator PMC Member >>> >>> >>>> >>> >>> >>>> https://www.linkedin.com/pub/christian-mueller/11/551/642 >>> >>> >>>> >>> >>> >>>> >>> >>> >>>> On Thu, Oct 10, 2013 at 12:28 PM, James Carman >>> >>> >>>> < >>> >>> >> >>> >>> >>>> james@ >>> >>> >> >>> >>> >>>> >wrote: >>> >>> >>>> >>> >>> >>>>> There are quite a few broken tests. Jetty seems to be hosed. >>> JPA >>> >>> has >>> >>> >>>>> a >>> >>> >>>>> failed test. CDI has issues. It looks like JMS and FTP even >>> >>> decided >>> >>> >>>>> to >>> >>> >>>>> join the party. This has been going on for a while now. This >>> >>> >>>>> particular >>> >>> >>>>> job hasn't been "green" since 9/29. Should we stop working >>> other >>> >>> >>>>> issues >>> >>> >>>>> and get ourselves whole again? >>> >>> >>>>> >>> >>> >>>>> https://builds.apache.org/job/Camel.trunk.fulltest/1561/ >>> >>> >>>>> >>> >>> >> >>> >>> >> >>> >>> >> >>> >>> >> >>> >>> >> >>> >>> >> -- >>> >>> >> View this message in context: >>> >>> >> >>> >>> >>> http://camel.465427.n5.nabble.com/Build-failures-tp5741273p5741403.html >>> >>> >> Sent from the Camel Development mailing list archive at >>> Nabble.com. >>> >>> > >>> >>> > >>> >>> > >>> >>> > -- >>> >>> > Claus Ibsen >>> >>> > ----------------- >>> >>> > Red Hat, Inc. >>> >>> > Email: >>> >>> >>> >>> > cibsen@ >>> >>> >>> >>> > Twitter: davsclaus >>> >>> > Blog: http://davsclaus.com >>> >>> > Author of Camel in Action: http://www.manning.com/ibsen >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> -- >>> >>> View this message in context: >>> >>> >>> http://camel.465427.n5.nabble.com/Build-failures-tp5741273p5741448.html >>> >>> Sent from the Camel Development mailing list archive at Nabble.com. >>> >>> >>> >>> >>> >>> >>> >>> -- >>> View this message in context: >>> http://camel.465427.n5.nabble.com/Build-failures-tp5741273p5741864.html >>> Sent from the Camel Development mailing list archive at Nabble.com. >>> > > > > > > -- > View this message in context: http://camel.465427.n5.nabble.com/Build-failures-tp5741273p5741876.html > Sent from the Camel Development mailing list archive at Nabble.com. -- Claus Ibsen ----------------- Red Hat, Inc. Email: cibsen@redhat.com Twitter: davsclaus Blog: http://davsclaus.com Author of Camel in Action: http://www.manning.com/ibsen