2016-01-29 11 views
5

Ich habe eine Kamel Java DSL-Route, die einen Restlet-Endpunkt aufruft. Und die Route funktioniert ohne Probleme, wenn ich das selbe manuell treffe. Aber, wenn ich versuche, eine größere Anzahl von Anfragen durch den Code zu pumpen Ich erhalte „Timeout für die Verbindung von Pool wartetApache Camel Verbindung Pool-Timeout mit Restlet auch nach der Konfiguration von Komponentenoptionen

und folgende stackt-Rennen des gleiche:

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) 

und gemäß dem doc ich mit dem folgenden Code die Restlet Komponente tat konfigurieren, aber ich sehe immer noch das gleiche Problem:

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

Hinweis: die Route 10 Anfragen zu einer Zeit angenommen hat dann Gettin ich begann g Fehler. Und von der Konfiguration konnte ich sehen, dass die maxThreads standardmäßig 10 ist. Was bedeutet, dass das, was ich durch Bean getan habe, nicht richtig aufgreift.

+0

ich dem Code eine kleine Änderung hat, definiert Restlet Bean vor dem Konfigurieren und dann ging alles gut. –

+0

Schreiben Sie eine Antwort mit Ihrer Lösung, damit andere davon profitieren können. –

Antwort

2

Eigentlich in meinem Code habe ich definiert Restlet Bohne nach Route konfigurieren, dh wie unten

public class RoutesBuilder extends FatJarRouter { 

.... 

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

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

Und jetzt habe ich die Reihenfolge der Definition des Codes als dh zuerst geändert Ich habe definiert Restlet und die Route zu konfigurieren, wie unten . Nachdem ich festgestellt hatte, dass die Restlet-Konfiguration aufgenommen wurde, sehe ich das Problem mit dem Verbindungspool nicht mehr.

public class RoutesBuilder extends FatJarRouter { 

.... 

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

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


} 
1

Schauen Sie sich diese Dinge:

  1. Stellen Sie sicher, <context:annotation-config/> im Frühjahr App Kontext XML-Datei aktiviert haben.
  2. Verwenden Sie <context:component-scan base-package="<your package>" /> im Spring XML.
  3. Stellen Sie sicher, dass Sie das enthaltende @Bean mit @Configuration annotiert haben.
  4. Fügen Sie das Attribut name dem @Bean hinzu: @Bean(name={"restlet"}).

Hoffe, dass hilft.

+0

Meine Anwendung ist Camel-Spring-Boot-Anwendung, so dass die ersten drei Dinge, die Sie erwähnt haben, beachtet wird. Ich habe die Bohne wie in 4 gezeigt benannt, aber ich sehe immer noch das Problem. Meine routesbuilder Klasse aussehen wie unten: [at] SpringBootApplication public class RoutesBuilder FatJarRouter erstreckt { ..... [at] außer Kraft setzen public void configure() throws JAXBException { ..... } } –

0

Schauen Sie sich dieses Beispiel an. Seine Spring-Boot-APP. Ich habe eine separate Config-Klasse und verwendet Feder-Boot-Konfiguration Anmerkung, so beim Start feder Boot macht die ganze Konfiguration

benötigt

Hier ist eine Arbeitslösung https://github.com/RakeshBhat/rb-springbootcamelrestlet