Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Problems with Camel DynamicEndpoint toD and Http-Component

I'm using Camel Version 3.7 with Java 11 (AdoptOpenJDK)

I'm trying gto make an http-call with dynamic timeout, passed by header

Map<String,Object> headerMap=new HashMap<>();
headerMap.put(Exchange.HTTP_URI, "http://myserver.example.com");
headerMap.put("timeout", 5000);
main.getCamelTemplate().sendBodyAndHeaders("direct:test_http_dynamic",null,headerMap);

the endpoint looks like this:


from("direct:test_http_dynamic")
  .toD("http:test.dyn?socketTimeout=${in.header.timeout}");

This leads to this Stacktrace:

org.apache.camel.ResolveEndpointFailedException: Failed to resolve endpoint: http://http:test.dyn due to: Failed to resolve endpoint: http://http:test.dyn due to: The uri part is not configured correctly. You have duplicated the http(s) protocol.
    at org.apache.camel.impl.engine.AbstractCamelContext.doGetEndpoint(AbstractCamelContext.java:912) ~[camel-base-engine-3.7.0.jar:3.7.0]
    at org.apache.camel.impl.engine.AbstractCamelContext.getEndpoint(AbstractCamelContext.java:798) ~[camel-base-engine-3.7.0.jar:3.7.0]
    at org.apache.camel.support.CamelContextHelper.getMandatoryEndpoint(CamelContextHelper.java:73) ~[camel-support-3.7.0.jar:3.7.0]
    at org.apache.camel.support.ExchangeHelper.resolveEndpoint(ExchangeHelper.java:112) ~[camel-support-3.7.0.jar:3.7.0]
    at org.apache.camel.support.ExchangeHelper.resolveEndpoint(ExchangeHelper.java:91) ~[camel-support-3.7.0.jar:3.7.0]
    at org.apache.camel.processor.SendDynamicProcessor.resolveEndpoint(SendDynamicProcessor.java:294) ~[camel-core-processor-3.7.0.jar:3.7.0]
    at org.apache.camel.processor.SendDynamicProcessor.process(SendDynamicProcessor.java:155) ~[camel-core-processor-3.7.0.jar:3.7.0]
    at org.apache.camel.processor.errorhandler.RedeliveryErrorHandler$SimpleTask.run(RedeliveryErrorHandler.java:395) [camel-core-processor-3.7.0.jar:3.7.0]
    at org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.schedule(DefaultReactiveExecutor.java:148) [camel-base-engine-3.7.0.jar:3.7.0]
    at org.apache.camel.impl.engine.DefaultReactiveExecutor.scheduleMain(DefaultReactiveExecutor.java:60) [camel-base-engine-3.7.0.jar:3.7.0]
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:147) [camel-core-processor-3.7.0.jar:3.7.0]
    at org.apache.camel.impl.engine.CamelInternalProcessor.process(CamelInternalProcessor.java:312) [camel-base-engine-3.7.0.jar:3.7.0]
    at org.apache.camel.component.direct.DirectProducer.process(DirectProducer.java:84) [camel-direct-3.7.0.jar:3.7.0]
    at org.apache.camel.impl.engine.SharedCamelInternalProcessor.process(SharedCamelInternalProcessor.java:218) [camel-base-engine-3.7.0.jar:3.7.0]
    at org.apache.camel.impl.engine.SharedCamelInternalProcessor$1.process(SharedCamelInternalProcessor.java:112) [camel-base-engine-3.7.0.jar:3.7.0]
    at org.apache.camel.impl.engine.DefaultAsyncProcessorAwaitManager.process(DefaultAsyncProcessorAwaitManager.java:83) [camel-base-engine-3.7.0.jar:3.7.0]
    at org.apache.camel.impl.engine.SharedCamelInternalProcessor.process(SharedCamelInternalProcessor.java:109) [camel-base-engine-3.7.0.jar:3.7.0]
    at org.apache.camel.support.cache.DefaultProducerCache.send(DefaultProducerCache.java:189) [camel-support-3.7.0.jar:3.7.0]
    at org.apache.camel.impl.engine.DefaultProducerTemplate.send(DefaultProducerTemplate.java:176) [camel-base-engine-3.7.0.jar:3.7.0]
    at org.apache.camel.impl.engine.DefaultProducerTemplate.send(DefaultProducerTemplate.java:172) [camel-base-engine-3.7.0.jar:3.7.0]
    at org.apache.camel.impl.engine.DefaultProducerTemplate.send(DefaultProducerTemplate.java:153) [camel-base-engine-3.7.0.jar:3.7.0]
    at org.apache.camel.impl.engine.DefaultProducerTemplate.sendBodyAndHeaders(DefaultProducerTemplate.java:311) [camel-base-engine-3.7.0.jar:3.7.0]
    at org.apache.camel.impl.engine.DefaultProducerTemplate.sendBodyAndHeaders(DefaultProducerTemplate.java:305) [camel-base-engine-3.7.0.jar:3.7.0]
    at de.falschefreunde.camelhttptest.App$2.run(App.java:42) [classes/:?]
    at java.lang.Thread.run(Thread.java:834) [?:?]
Caused by: org.apache.camel.ResolveEndpointFailedException: Failed to resolve endpoint: http://http:test.dyn due to: The uri part is not configured correctly. You have duplicated the http(s) protocol.
    at org.apache.camel.component.http.HttpComponent.createEndpoint(HttpComponent.java:298) ~[camel-http-3.7.0.jar:3.7.0]
    at org.apache.camel.support.DefaultComponent.createEndpoint(DefaultComponent.java:170) ~[camel-support-3.7.0.jar:3.7.0]
    at org.apache.camel.impl.engine.AbstractCamelContext.doGetEndpoint(AbstractCamelContext.java:878) ~[camel-base-engine-3.7.0.jar:3.7.0]
    ... 24 more``

It runs in Camel-Version 3.4 and 3.5. But not in 3.6 and 3.7 Am I doing something wrong? Did Interface change? I didn't find anything in the documentation.

===

Update 1 / Workaround(?) :

seems that HttpSendDynamicAware mixes something up with the URI. Turning off the Optimizer does the trick:

from("direct:test_http_dynamic")
.toD().allowOptimisedComponents(false).cacheSize(10).uri("http:test.dyn?socketTimeout=${in.header.timeout}");

===

Update 2

Seems to be a bug since Version 3.6.0

Jira-Ticket created

https://issues.apache.org/jira/browse/CAMEL-16216

like image 975
Josef Tember Avatar asked Jun 29 '26 07:06

Josef Tember


1 Answers

In discussion I found out the unerlying optimizer is build for dynamic context-path and query-parameters. Not for dynamic timeouts.

(read comments https://issues.apache.org/jira/browse/CAMEL-16216 )

If you want to have dynamic timeouts - you have to turn the optimzer off

from("direct:test_http_dynamic_no_optimzer")
.toD().allowOptimisedComponents(false).cacheSize(10).uri("http:test.dyn?socketTimeout=${in.header.timeout}");

But be aware that each call with different timeout will create a new http-client.

like image 117
Josef Tember Avatar answered Jul 01 '26 21:07

Josef Tember