2016-01-29 35 views
5

Ho una route DSL Java cammello che richiama un endpoint di restlet. E il percorso funziona senza problemi quando colpisco lo stesso manualmente. Ma, quando provo a pompare un numero maggiore di richieste in codice che sto ricevendo "Timeout in attesa di connessione dal pool"Cammello Apache Timeout del pool di connessione con restlet anche dopo aver configurato le opzioni del componente

E la seguente è stackt-gara della stessa:

2016-01-29 14:09:38.650 WARN 20256 --- [pool-3-thread-2] org.restlet        : An error occurred during the communication with the remote HTTP server.org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool 
at org.apache.http.impl.conn.tsccm.ConnPoolByRoute.getEntryBlocking(ConnPoolByRoute.java:412) 
at org.apache.http.impl.conn.tsccm.ConnPoolByRoute$1.getPoolEntry(ConnPoolByRoute.java:298) 
at org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager$1.getConnection(ThreadSafeClientConnManager.java:238) 
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:423) 
at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:863) 
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82) 
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:106) 
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:57) 
at org.restlet.ext.httpclient.internal.HttpMethodCall.sendRequest(HttpMethodCall.java:339) 
at org.restlet.engine.adapter.ClientAdapter.commit(ClientAdapter.java:105) 
at org.restlet.engine.adapter.HttpClientHelper.handle(HttpClientHelper.java:119) 
at org.restlet.Client.handle(Client.java:153) 
at org.restlet.Restlet.handle(Restlet.java:275) 
at org.apache.camel.component.restlet.RestletProducer.process(RestletProducer.java:79) 
at org.apache.camel.component.restlet.RestletProducer.process(RestletProducer.java:98) 
at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:141) 
at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77) 
at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:460) 
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:190) 
at org.apache.camel.processor.Pipeline.process(Pipeline.java:121) 
at org.apache.camel.processor.Pipeline.process(Pipeline.java:83) 
at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:460) 
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:190) 
at org.apache.camel.processor.MulticastProcessor.doProcessSequential(MulticastProcessor.java:668) 
at org.apache.camel.processor.MulticastProcessor.doProcessSequential(MulticastProcessor.java:596) 
at org.apache.camel.processor.MulticastProcessor.process(MulticastProcessor.java:237) 
at org.apache.camel.processor.Splitter.process(Splitter.java:104) 
at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77) 
at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:460) 
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:190) 
at org.apache.camel.processor.Pipeline.process(Pipeline.java:121) 
at org.apache.camel.processor.Pipeline.process(Pipeline.java:83) 
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:190) 
at org.apache.camel.component.direct.DirectProducer.process(DirectProducer.java:62) 
at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:141) 
at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77) 
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:190) 
at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:460) 
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:190) 
at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:109) 
at org.apache.camel.processor.MulticastProcessor.doProcessParallel(MulticastProcessor.java:814) 
at org.apache.camel.processor.MulticastProcessor.access$200(MulticastProcessor.java:84) 
at org.apache.camel.processor.MulticastProcessor$1.call(MulticastProcessor.java:314) 
at org.apache.camel.processor.MulticastProcessor$1.call(MulticastProcessor.java:299) 
at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
at java.lang.Thread.run(Thread.java:745) 

e come per il documento che ho fatto configurare il componente Restlet con il seguente codice, ma sto ancora vedendo lo stesso problema:

@Bean 
public RestletComponent restlet() 
{ 
    RestletComponent restlet = new RestletComponent(); 
    restlet.setMaxThreads(100); 
    restlet.setThreadMaxIdleTimeMs(10000); 
    restlet.setMaxQueued(20); 
    return restlet; 
} 

Nota: il percorso ha accettato 10 richieste in un momento poi ho iniziato gettin errori g. E dalla configurazione ho potuto vedere il maxThreads di default è 10. Il che significa che quello che ho fatto attraverso Bean non sta raccogliendo correttamente.

+0

ho fatto una piccola modifica al codice, Restlet definito Fagiolo prima di configurare e poi tutto è andato bene. –

+0

Scrivi una risposta con la tua soluzione in modo che altri possano trarne beneficio. –

risposta

2

In realtà nel mio codice ho definito di fagioli Restlet dopo configure route cioè come di seguito

public class RoutesBuilder extends FatJarRouter { 

.... 

@Override 
    public void configure() throws JAXBException { 
    ...... 
} 

@Bean(name={"restlet"}) 
    public RestletComponent restlet() 
    { 
     ....... 
    } 
} 

e ora ho cambiato l'ordine di definizione del codice come ad esempio Restlet prima ho definito e configurare percorso come di seguito . Con quello sul posto ho visto che la configurazione del restlet è stata rilevata e non vedo più il problema del pool di connessioni.

public class RoutesBuilder extends FatJarRouter { 

.... 

@Bean(name={"restlet"}) 
    public RestletComponent restlet() 
    { 
     ....... 
    } 

@Override 
    public void configure() throws JAXBException { 
    ...... 
} 


} 
1

controllare queste cose:

  1. assicurarsi di aver abilitato <context:annotation-config/> nel file XML contesto Primavera App.
  2. Utilizzare <context:component-scan base-package="<your package>" /> nell'XML di primavera.
  3. Assicurarsi di aver annotato il contenuto di @Bean con @Configuration.
  4. Aggiungere l'attributo name allo @Bean: @Bean(name={"restlet"}).

Spero che questo aiuti.

+0

La mia applicazione è un'applicazione di avvio camel-spring in modo che le prime tre cose che hai menzionato siano curate. Ho chiamato il bean come indicato in 4 ma ancora sto vedendo il problema. Il mio routesbuilder classe aspetto come di seguito: [at] SpringBootApplication public class RoutesBuilder estende FatJarRouter { ..... [at] Override configure public void() genera JAXBException { ..... }} –

0

Dai un'occhiata a questo esempio. La sua APP Spring-boot. Ho creato una classe di configurazione separato e utilizzato annotazione configurazione di primavera-boot, quindi all'avvio primavera-boot fa tutto la configurazione necessaria

Ecco una soluzione di lavoro https://github.com/RakeshBhat/rb-springbootcamelrestlet