我创建了一个从远程主机获取联系的简单路由。但是,关于bridgeEndpoint选项似乎有很多混淆。
最初,我使用Java DSL添加了路由,如下所示:
from("direct:getContact")
.marshal().json(JsonLibrary.Jackson)
.setHeader("Content-Type", constant("application/json"))
.setHeader("Accept", constant("application/json"))
.setHeader(Exchange.HTTP_METHOD, constant("GET"))
.recipientList(simple("http://<remoteHost>:8080/api/contact" +
"/${header.contactId}"))
.unmarshal().json(JsonLibrary.Jackson);此路由只是远程主机的get contact API的代理。我得到了以下错误:
Invalid uri: /ib/contact/51702/contact/51702. If you are forwarding/bridging http endpoints, then enable the bridgeEndpoint option on the endpoint: Endpoint[http://<remoteHost>:8080/api/contact/51702]/ib/*您看到的是tomcat servlet的基本url。按照错误中的建议,我将bridgeEndpoint=true添加到端点,如下所示:
from("direct:getContact")
.marshal().json(JsonLibrary.Jackson)
.setHeader("Content-Type", constant("application/json"))
.setHeader("Accept", constant("application/json"))
.setHeader(Exchange.HTTP_METHOD, constant("GET"))
.recipientList(simple("http://<remoteHost>:8080/api/contact" +
"/${header.contactId}?bridgeEndpoint=true"))
.unmarshal().json(JsonLibrary.Jackson);然后,我得到一个不同的错误:
org.apache.camel.component.http.HttpOperationFailedException:
HTTP operation failed invoking
http://<remoteHost>:8080/api/contact/51702/contact/51702 with statusCode: 404
at org.apache.camel.component.http.HttpProducer.populateHttpOperationFailedException(HttpProducer.java:233)
at org.apache.camel.component.http.HttpProducer.process(HttpProducer.java:158)
at org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61)
at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:448)
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:190)
at org.apache.camel.processor.MulticastProcessor.doProcessSequential(MulticastProcessor.java:652)
at org.apache.camel.processor.MulticastProcessor.doProcessSequential(MulticastProcessor.java:580)
at org.apache.camel.processor.MulticastProcessor.process(MulticastProcessor.java:227)
at org.apache.camel.processor.RecipientList.sendToRecipientList(RecipientList.java:167)
at org.apache.camel.processor.RecipientList.process(RecipientList.java:120)
at org.apache.camel.processor.Pipeline.process(Pipeline.java:118)
at org.apache.camel.processor.Pipeline.process(Pipeline.java:80)它仍然将"contact/51702“附加到远程主机的url,该主机给出了404。这里我漏掉了什么?
发布于 2016-06-02 21:25:37
从FAQ
在camel中,有许多组件使用
协议头来完成它们的业务。
我相信你的制片人也是这样做的。所以下面的方法可以解决你的问题。
from("direct:getContact")
.marshal().json(JsonLibrary.Jackson)
.setHeader("Content-Type", constant("application/json"))
.setHeader("Accept", constant("application/json"))
.setHeader(Exchange.HTTP_METHOD, constant("GET"))
.removeHeader(Exchange.HTTP_PATH)
.recipientList(simple("http://<remoteHost>:8080/api/contact" +
"/${header.contactId}?bridgeEndpoint=true"))
.unmarshal().json(JsonLibrary.Jackson);您还可以从端点中删除contact/${header.contactId}。因为它看起来是多余的。但这取决于你想要实现什么。
发布于 2020-06-17 00:04:44
@SubOptimal的答案几乎是正确的,除了它应该是HTTP_URI标头。来自the doc
如果bridgeEndpoint选项为true,HttpProducer将忽略Exchange.HTTP_URI标头,并使用端点的URI进行请求。
因此,有两种解决方案:
.removeHeader(Exchange.HTTP_URI)添加到路由定义?bridgeEndpoint=true查询参数然而,如果你有其他的头文件,这可能不能解决问题。也许这就是你的情况,这就是为什么移除所有Camel http头文件会有帮助。
但是请注意,删除所有头部可能会破坏您的逻辑:例如,HTTP_METHOD头部用于定义传出请求的http方法。如果你也想要代理这个方法,这取决于你。您可以通过上面的链接在同一文档中找到更多信息。
https://stackoverflow.com/questions/37586488
复制相似问题