2014-06-17 3 views
0

J'ai une application composée de plusieurs modules déployés dans plusieurs instances de JBoss. Ces modules diffusent leurs numéros de version via JMS les uns aux autres.Apache Camel bloquant sur multicast

Cela fonctionne de la façon suivante. Chaque module diffuse périodiquement ses versions comme ceci:

camelTemplate.asyncSendBody(moduleVersionsOutputChannel, new ArrayList<>(moduleVersions)); 

est ici la définition de moduleVersionsOutputChannel:

<endpoint id="moduleVersionsOutputChannel" uri="direct:module.versions.output.channel"/> 

Ensuite, il y a une route qui consomme des messages de moduleVersionsOutputChannel (appelé comme source ci-dessous) et les messages des messages sur des sujets :

from(source).multicast() 
     .parallelProcessing().timeout(moduleVersionsMonitoringConfig.getMulticastTimeout()) 
     .to(moduleVersionsMonitoringConfig.getChannels()) 
     .id(moduleVersionsService.getCurrentModuleId() + "-outbound"); 

Au début, tout fonctionne bien, mais après un certain temps (heures ou jours) les threads qui font la multidiffusion est bloquée. J'observe des blocs à 2 points différents.

Le premier bloc se produit dans le fil où asyncSendBody est appelé:

"[email protected]" prio=5 tid=0x423 nid=NA waiting 
    java.lang.Thread.State: WAITING 
     at sun.misc.Unsafe.park(Unsafe.java:-1) 
     at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186) 
     at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:834) 
     at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:994) 
     at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1303) 
     at java.util.concurrent.CountDownLatch.await(CountDownLatch.java:236) 
     at org.apache.camel.processor.MulticastProcessor.doProcessParallel(MulticastProcessor.java:328) 
     at org.apache.camel.processor.MulticastProcessor.process(MulticastProcessor.java:214) 
     at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:72) 
     at org.apache.camel.processor.interceptor.TraceInterceptor.process(TraceInterceptor.java:163) 
     at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191) 
     at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191) 
     at org.apache.camel.component.direct.DirectProducer.process(DirectProducer.java:51) 
     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:346) 
     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$14.call(DefaultProducerTemplate.java:621) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:262) 
     at java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy.rejectedExecution(ThreadPoolExecutor.java:2025) 
     at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:821) 
     at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1372) 
     at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:132) 
     at org.apache.camel.impl.DefaultProducerTemplate.asyncSendBody(DefaultProducerTemplate.java:626) 
     at ... 

Une autre fois, les blocs d'exécution au point plus tard, quand il essaie en fait de poster un message à JMS sujets:

"Camel (moduleVersionsContext) thread #1044 - [email protected]" daemon prio=5 tid=0xa16 nid=NA waiting 
    java.lang.Thread.State: WAITING 
     at sun.misc.Unsafe.park(Unsafe.java:-1) 
     at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186) 
     at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:834) 
     at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:994) 
     at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1303) 
     at java.util.concurrent.Semaphore.acquire(Semaphore.java:472) 
     at org.hornetq.core.client.impl.ClientProducerCreditsImpl.acquireCredits(ClientProducerCreditsImpl.java:90) 
     at org.hornetq.core.client.impl.ClientProducerImpl.sendRegularMessage(ClientProducerImpl.java:307) 
     at org.hornetq.core.client.impl.ClientProducerImpl.doSend(ClientProducerImpl.java:288) 
     at org.hornetq.core.client.impl.ClientProducerImpl.send(ClientProducerImpl.java:140) 
     at org.hornetq.jms.client.HornetQMessageProducer.doSend(HornetQMessageProducer.java:438) 
     at org.hornetq.jms.client.HornetQMessageProducer.send(HornetQMessageProducer.java:205) 
     at org.springframework.jms.core.JmsTemplate.doSend(JmsTemplate.java:589) 
     at org.apache.camel.component.jms.JmsConfiguration$CamelJmsTemplate.doSend(JmsConfiguration.java:336) 
     at org.apache.camel.component.jms.JmsConfiguration$CamelJmsTemplate.doSendToDestination(JmsConfiguration.java:275) 
     at org.apache.camel.component.jms.JmsConfiguration$CamelJmsTemplate.access$100(JmsConfiguration.java:217) 
     at org.apache.camel.component.jms.JmsConfiguration$CamelJmsTemplate$1.doInJms(JmsConfiguration.java:231) 
     at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:466) 
     at org.apache.camel.component.jms.JmsConfiguration$CamelJmsTemplate.send(JmsConfiguration.java:228) 
     at org.apache.camel.component.jms.JmsProducer.doSend(JmsProducer.java:431) 
     at org.apache.camel.component.jms.JmsProducer.processInOnly(JmsProducer.java:385) 
     at org.apache.camel.component.jms.JmsProducer.process(JmsProducer.java:153) 
     at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:110) 
     at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:72) 
     at org.apache.camel.processor.interceptor.TraceInterceptor.process(TraceInterceptor.java:163) 
     at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191) 
     at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:398) 
     at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191) 
     at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:105) 
     at org.apache.camel.processor.MulticastProcessor.doProcessParallel(MulticastProcessor.java:712) 
     at org.apache.camel.processor.MulticastProcessor.access$200(MulticastProcessor.java:83) 
     at org.apache.camel.processor.MulticastProcessor$1.call(MulticastProcessor.java:293) 
     at org.apache.camel.processor.MulticastProcessor$1.call(MulticastProcessor.java:278) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:262) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
     at java.lang.Thread.run(Thread.java:744) 

Pouvez-vous me dire si j'ai un bogue dans ma configuration Camel ou si c'est un problème connu de Camel et qu'il y a une solution?

Environnement:

  • Apache Camel 2.12.3
  • JBoss EAP 6.1
  • OpenJDK 1.7.0_55
  • Ubuntu Linux 12.04 LTS
+0

Avez-vous trouvé une solution à ce problème? – John

+0

Malheureusement pas – wheleph

Répondre