骆驼动态端点toD和http组件的问题



我正在使用Camel Version 3.7 with Java 11 (AdoptOpenJDK)

我正在尝试使用动态超时进行http调用,通过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);

端点是这样的:


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

这会导致这样的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``

它运行在Camel-Version 3.4和3.5。但在3.6年和3.7年没有我做错了什么吗?界面改变了吗?我没有在文档中找到任何东西。

= = =

更新1/解决方法(?):

似乎httpenddynamicaware与URI混合了一些东西。关闭优化器可以达到这个目的:

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

= = =更新2

似乎是3.6.0版本以来的一个bug

Jira-Ticket创建

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

在讨论中,我发现底层优化器是为动态上下文路径和查询参数构建的。

(阅读评论https://issues.apache.org/jira/browse/CAMEL-16216)

如果你想要动态超时-你必须关闭优化器

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

但是要注意,每个具有不同超时的调用将创建一个新的http-client。

最新更新