I am trying to make sure my application is resilient. It sends JMS messages to
a remote ActiveMQ broker. Unfortunately when that broker goes down the client
starts to block even though I am using the Camel asyncSendBody method. See
below for the stack trace.
The ActiveMQ version is 5.3.0 although I have the same problem with the most
recent stable release.
This is the argument I give to the asyncSendBody method:
jms:queue:myQueue?jmsMessageType=Text&timeToLive=5000
My connection factory uses this URL:
failover:(tcp://my.ip:61613,tcp://my:ip:61613)?useExponentialBackOff=true&randomize=false&timeout=1000
As the broker starts to fail I see lots of the following errors in the log:
org.apache.camel.processor.UnitOfWorkProcessor - Caught unhandled
exception while processing ExchangeId:
ID-james-upcit-ds-upc-biz-64404-1334601186430-0-38
IOException: Failover timeout of 1000 ms reached
org.apache.activemq.transport.failover.FailoverTransport - Failover timed
out after 29998ms
Then after attempting to send quite a few more messages the blocking starts. I
can't go live with my application in this state and I really don't want to put
another queue in place to decouple the JMS producer. Is there something I am
doing wrong? If the broker is down I am quite happy for these messages to be
lost - they lose their meaning if not delivered immediately.
Thanks
James
at java.lang.Object.wait(Native Method)
at
org.apache.activemq.transport.failover.FailoverTransport.oneway(FailoverTransport.java:433)
at
org.apache.activemq.transport.MutexTransport.oneway(MutexTransport.java:40)
at
org.apache.activemq.transport.ResponseCorrelator.asyncRequest(ResponseCorrelator.java:74)
at
org.apache.activemq.transport.ResponseCorrelator.request(ResponseCorrelator.java:79)
at
org.apache.activemq.ActiveMQConnection.syncSendPacket(ActiveMQConnection.java:1244)
at
org.apache.activemq.ActiveMQConnection.ensureConnectionInfoSent(ActiveMQConnection.java:1350)
at
org.apache.activemq.ActiveMQConnection.createSession(ActiveMQConnection.java:300)
at
org.springframework.jms.support.JmsAccessor.createSession(JmsAccessor.java:196)
at
org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:457)
at
org.apache.camel.component.jms.JmsConfiguration$CamelJmsTemplate.send(JmsConfiguration.java:185)
at
org.apache.camel.component.jms.JmsProducer.doSend(JmsProducer.java:359)
at
org.apache.camel.component.jms.JmsProducer.processInOnly(JmsProducer.java:313)
at
org.apache.camel.component.jms.JmsProducer.process(JmsProducer.java:111)
at
org.apache.camel.processor.UnitOfWorkProcessor.processAsync(UnitOfWorkProcessor.java:150)
at
org.apache.camel.processor.UnitOfWorkProcessor.process(UnitOfWorkProcessor.java:117)
at
org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:99)
at
org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:86)
at
org.apache.camel.processor.UnitOfWorkProducer.process(UnitOfWorkProducer.java:63)
at
org.apache.camel.impl.ProducerCache$2.doInProducer(ProducerCache.java:352)
at
org.apache.camel.impl.ProducerCache$2.doInProducer(ProducerCache.java:324)
at
org.apache.camel.impl.ProducerCache.doInProducer(ProducerCache.java:223)
at
org.apache.camel.impl.ProducerCache.sendExchange(ProducerCache.java:324)
at org.apache.camel.impl.ProducerCache.send(ProducerCache.java:169)
at
org.apache.camel.impl.DefaultProducerTemplate.send(DefaultProducerTemplate.java:111)
at
org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:124)
at
org.apache.camel.impl.DefaultProducerTemplate$14.call(DefaultProducerTemplate.java:596)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at
java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy.rejectedExecution(ThreadPoolExecutor.java:1746)
at
java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:767)
at
java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:658)
at
java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:92)
at
org.apache.camel.impl.DefaultProducerTemplate.asyncSendBody(DefaultProducerTemplate.java:601)
at
org.apache.camel.impl.DefaultProducerTemplate.asyncSendBody(DefaultProducerTemplate.java:458)