我有以下路线:
from("quartz2:findAll//myGroup/myTimerName?cron=" + pushProperties.getQuartz())
//.setBody().constant("{ \"id\": \"FBJDBFJHSDBFJSBDfi\" }")
.to("mongodb:mongoBean?database=" + mongoDataConfiguration.getDatabase()
+ "&operation=findAll&collection=" + mongoDataConfiguration.getDataPointCollection())
.process(exchange -> {
exchange.getIn().setBody(objectMapper.writeValueAsString(exchange.getIn().getBody()));
}).streamCaching()
.setHeader(Exchange.HTTP_METHOD, constant(pushProperties.getHttpMethod()))
.setHeader(Exchange.CONTENT_TYPE, constant(MediaType.APPLICATION_JSON_VALUE))
.to(pushProperties.getUrl() + "&throwExceptionOnFailure=false").streamCaching()
如您所见,我使用throwExceptionOnFailure=false
我从配置中获取了我的网址。但是我们发现如果pushProperties.getUrl()
= localhost:8080/url?action=myaction
并且在以下情况下不起作用pushProperties.getUrl()
= localhost:8080/url
在camel中是否有通用的方法来添加请求参数到URL?
比如:
private String buildUrl() {
String url = pushProperties.getUrl();
return url + (url.contains("?") ? "&" : "?") + "throwExceptionOnFailure=false";
}
Camel 皮内
3条答案
按热度按时间zdwk9cvp1#
这是因为在
localhost:8080/url
的情况下,在附加之后,它变成这样localhost:8080/url&throwExceptionOnFailure=false
这是不对的
应该是
localhost:8080/url?throwExceptionOnFailure=false
,在第一种情况下,您已经有一个requestpatam(
?action=myaction
),所以下一个请求可以用"&"符号添加dsf9zpds2#
我认为您必须添加自己的逻辑,以便在运行时将端点组合到
http
组件中,这是因为CamelContext
将在路由过程中处理它,参数throwExceptionOnFailure
是http
组件中的一个属性。我不认为通过
.setHeader(Exchange.HTTP_QUERY, constant("throwExceptionOnFailure=false"))
添加参数会起作用,因为这些参数将在http
组件得到处理后进行评估,例如到URL目的地。请看一下"How to use a dynamic URI in to()":您可以使用simple expression编写一个逻辑,根据
pushProperties.getUrl()
的结果执行您想要的操作。jtw3ybtb3#
我不喜欢Camel在这种情况下配置HTTP组件的方式,但这就是它。
我的建议是创建一个configMap,并将您的args附加到它,然后用“&"进行手动连接,然后将其附加到主URL。
我这样做:
注意,toD需要优化,但在这种情况下,不能使用HTTP_QUERY。
优化组件正在使用时,不能使用Exchange.HTTP_PATH和Exchange.HTTP_QUERY标头来提供动态值以覆盖toD中的URI。如果要使用这些标头,请改用纯DSL。换句话说,toD在内部使用这些标头来承载端点的动态详细资料。
https://camel.apache.org/components/3.20.x/eips/toD-eip.html