Hi If you use spring transaction (camel policy stuff) then it's in fact the backing transaction manager that handles all the stuff with delay, timeouts, number of retries etc.
James added some initial options in camel for setting some delays etc. but they are not fully implemented, and to my knowledge has a flaw in its delay handling somewhere - we have a ticket in JIRA for this. Med venlig hilsen Claus Ibsen ...................................... Silverbullet Skovsgårdsvænget 21 8362 Hørning Tlf. +45 2962 7576 Web: www.silverbullet.dk -----Original Message----- From: Piotr Jagielski [mailto:[EMAIL PROTECTED] Sent: 7. august 2008 10:47 To: [email protected] Subject: Re: Servicemix/Camel problem - ToJbiProcessor hangs Gert, I'm a bit confused with jms transaction timeout configuration. My test is: ... private TransactionTemplate transactionTemplate = new TransactionTemplate(); protected ConnectionFactory connectionFactory; protected Policy required; protected JmsComponent component = new JmsComponent(); protected JmsConfiguration configuration = new JmsConfiguration(); protected JmsTransactionManager manager = new JmsTransactionManager(); ... @Override protected CamelContext createCamelContext() throws Exception { CamelContext camelContext = super.createCamelContext(); connectionFactory = new ActiveMQConnectionFactory("vm://localhost?broker.persistent=false"); manager.setConnectionFactory(connectionFactory); configuration.setTransacted(true); configuration.setConnectionFactory(connectionFactory); configuration.setTransactionManager(manager); component.setConfiguration(configuration); camelContext.addComponent("activemq", component); transactionTemplate.setTransactionManager(manager); transactionTemplate.setTimeout(3); required = new SpringTransactionPolicy(transactionTemplate); return camelContext; } @Override protected RouteBuilder createRouteBuilder() throws Exception { return new RouteBuilder() { public void configure() throws Exception { from("activemq:q1").policy(required) .process(new Processor() { public void process(Exchange exchange) throws Exception { log.info("Before delayer "); } }) .delayer(4000) .process(new Processor() { public void process(Exchange exchange) throws Exception { log.info("After delayer !!!!!!!!!!!!!!!! "); } }) .to("mock:empty"); } }; } ... So I expect that timeout should occur and the mock:empty endpoint should be empty. But that never happens - 'After delayer' log is displayed and process completes. Setting defaultTimeout in transactionManager also didn't help... Any ideas? Regards, Piotr Gert Vanthienen wrote: > > Piotr, > > My guess was that the Camel component's thread pool was running out of > threads. If it is, it wouldn't be showing in any of the components' > stacktraces -- they would just be polling the DeliveryChannel for work > like the ones you posted. Does your to("jbi:...") ever end up in another > Camel routes (e.g. in one that starts with from("jbi:..." )-- if not, we > can forget about the thread pool as a cause for your problems > alltogether... > > You should be able to set the transaction timeout through the JMS > endpoint as document on http://activemq.apache.org/camel/jms.html > > Regards, > > Gert > > Piotr Jagielski wrote: >> Gert, >> >> In this case only camel jms listener thread hangs, other servicemix >> components threads are just waiting like: >> >> "pool-component.servicemix-http-thread-1" prio=1 tid=0x00002aaab8193500 >> nid=0x4d97 waiting on condition [0x0000000047611000..0x0000000047611c40] >> at sun.misc.Unsafe.park(Native Method) >> at >> java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:146) >> at >> java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:1803) >> at >> java.util.concurrent.ArrayBlockingQueue.poll(ArrayBlockingQueue.java:286) >> at >> org.apache.servicemix.jbi.messaging.DeliveryChannelImpl.accept(DeliveryChannelImpl.java:270) >> at >> org.apache.servicemix.common.AsyncBaseLifeCycle.pollDeliveryChannel(AsyncBaseLifeCycle.java:314) >> at >> org.apache.servicemix.common.AsyncBaseLifeCycle$1.run(AsyncBaseLifeCycle.java:300) >> at >> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650) >> at >> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675) >> at java.lang.Thread.run(Thread.java:595) >> >> There is one pool-component-servicemix-http thread with stack like: >> >> "pool-component.servicemix-http-thread-1" prio=1 tid=0x00002aaab8193500 >> nid=0x4d97 waiting on condition [0x0000000047611000..0x0000000047611c40] >> at sun.misc.Unsafe.park(Native Method) >> at >> java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:146) >> at >> java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:1803) >> at >> java.util.concurrent.ArrayBlockingQueue.poll(ArrayBlockingQueue.java:286) >> at >> org.apache.servicemix.jbi.messaging.DeliveryChannelImpl.accept(DeliveryChannelImpl.java:270) >> at >> org.apache.servicemix.common.AsyncBaseLifeCycle.pollDeliveryChannel(AsyncBaseLifeCycle.java:314) >> at >> org.apache.servicemix.common.AsyncBaseLifeCycle$1.run(AsyncBaseLifeCycle.java:300) >> at >> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650) >> at >> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675) >> at java.lang.Thread.run(Thread.java:595) >> >> Is it possible to recover from this by setting some timeout on jms >> transaction manager? >> My route definition is: >> from("activemq:queueA").policy(required) >> .to("jbi:endpoint:B") >> >> Regards, >> Piotr >> >> >> Gert Vanthienen wrote: >> >>> Piotr, >>> >>> I'm guessing that at some point, the message you sent to the jbi >>> endpoint ends up in another Camel route. ServiceMix has a thread pool >>> per component, so in order to process the exchange in the second Camel >>> route, it needs another thread from the pool, where all threads are >>> already waiting on sendSync. >>> >>> We should probably improve the servicemix-camel component to use send() >>> instead of sendSync() whenever possible. For now, you should try to >>> increase the size of the thread pools by modifying >>> conf/servicemix.properties (for a global increase of thread pool size) >>> or by looking at http://servicemix.apache.org/thread-pools.html for a >>> more targeted tuning. >>> >>> Regards, >>> >>> Gert >>> >>> Piotr Jagielski wrote: >>> >>>> Hi, >>>> >>>> I have some servicemix-camel service unit which uses following route: >>>> jms queue -> jbi endpoint >>>> >>>> After launching some long-running tests, following error occured : >>>> >>>> Exception in thread "ActiveMQ Transport: tcp:///127.0.0.1:41368" >>>> java.lang.ArrayIndexOutOfBoundsException: 28515 >>>> >>>>> ---at >>>>> >>>> org.apache.activemq.openwire.OpenWireFormat.getFromUnmarshallCache(OpenWireFormat.java:513) >>>> >>>> >>>> >>>>> ---at >>>>> >>>> org.apache.activemq.openwire.v2.BaseDataStreamMarshaller.tightUnmarsalCachedObject(BaseDataStreamMarshaller.java:137) >>>> >>>> >>>> >>>>> ---at >>>>> >>>> org.apache.activemq.openwire.v2.ConnectionInfoMarshaller.tightUnmarshal(ConnectionInfoMarshaller.java:69) >>>> >>>> >>>> >>>>> ---at >>>>> >>>> org.apache.activemq.openwire.OpenWireFormat.doUnmarshal(OpenWireFormat.java:347) >>>> >>>> >>>> >>>>> ---at >>>>> >>>> org.apache.activemq.openwire.OpenWireFormat.unmarshal(OpenWireFormat.java:273) >>>> >>>> >>>> >>>>> ---at >>>>> >>>> org.apache.activemq.transport.tcp.TcpTransport.readCommand(TcpTransport.java:156) >>>> >>>> >>>> >>>>> ---at >>>>> >>>> org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:136) >>>> >>>>> ---at java.lang.Thread.run(Thread.java:595) >>>>> >>>> This exception is not itself a problem, but when i looked at thread >>>> dump, it appeared that ToJbiProcessor hung on DeliveryChannel.sendSync >>>> : >>>> >>>> "DefaultMessageListenerContainer-1776" prio=1 tid=0x00002aaaaea39ee0 >>>> nid=0x4547 in Object.wait() [0x00000000539d3000..0x00000000539d4e40] >>>> at java.lang.Object.wait(Native Method) >>>> - waiting on <0x00002afd9884a428> (a >>>> org.apache.servicemix.jbi.messaging.InOutImpl) >>>> at >>>> org.apache.servicemix.jbi.messaging.DeliveryChannelImpl.waitForExchange(DeliveryChannelImpl.java:699) >>>> >>>> >>>> at >>>> org.apache.servicemix.jbi.messaging.DeliveryChannelImpl.sendSync(DeliveryChannelImpl.java:472) >>>> >>>> >>>> - locked <0x00002afd9884a428> (a >>>> org.apache.servicemix.jbi.messaging.InOutImpl) >>>> at >>>> org.apache.servicemix.jbi.messaging.DeliveryChannelImpl.sendSync(DeliveryChannelImpl.java:442) >>>> >>>> >>>> at >>>> org.apache.servicemix.camel.ToJbiProcessor.process(ToJbiProcessor.java:76) >>>> >>>> at >>>> org.apache.servicemix.camel.JbiEndpoint$1.process(JbiEndpoint.java:46) >>>> at >>>> org.apache.camel.util.ProducerCache.send(ProducerCache.java:67) >>>> at org.apache.camel.CamelTemplate.send(CamelTemplate.java:107) >>>> at org.apache.camel.CamelTemplate.send(CamelTemplate.java:57) >>>> >>>> Is it possible to set some timeout while calling >>>> DeliveryChannel.sendSync? >>>> Or shall I set timeout on jms transaction manager to rollback whole >>>> transaction? (How to do this?) >>>> Should I post this on servicemix-user too? >>>> >>>> Regards, >>>> Piotr >>>> >>>> >>> >>> ----- >>> --- >>> Gert Vanthienen >>> http://www.anova.be >>> >>> >> >> > > > > ----- > --- > Gert Vanthienen > http://www.anova.be > -- View this message in context: http://www.nabble.com/Servicemix-Camel-problem---ToJbiProcessor-hangs-tp18651622s22882p18866389.html Sent from the Camel - Users mailing list archive at Nabble.com.
