我想配置一个可以在运行时指定to(uri)
的Camel路由。
我尝试了以下内容:
public class Foo extends RouteBuilder {
@Override
public void configure() {
// the URI can point to different hosts
from("direct:start").to(${someUri}");
}
}
然后
ProducerTemplate pt = camelContext.createProducerTemplate();
pt.requestBodyAndHeader("direct:start", "someUri", "http://example.com");
但是上述方法不起作用(Camel抱怨没有默认的端点)。
最好的方法是什么?
答案 0 :(得分:3)
请参阅以下链接:
http://camel.apache.org/how-do-i-use-dynamic-uri-in-to.html
http://camel.apache.org/recipient-list.html
例如,请参阅此单元测试
答案 1 :(得分:2)
虽然这个问题已经得到解答,但我想分享另一个选项,以实现您正在寻找的内容,以防其他人仍然想知道如何做到这一点:
自Camel 2.16以来,有一种新方法叫做#34; toD"这基本上意味着"动态到"。 Here is the official reference documentation
from("direct:start")
.toD("${someUri}");
在这种情况下,toD方法使用Simple language解析参数,这意味着您可以使用该语言支持的任何属性。
您还可以查看关于相同主题的this other StackOverflow answer。
答案 2 :(得分:0)
我只是在它之前没有使用'$'的花括号。这是我做的:
{headers.reQueueName} instead of ${headers.reQueueName} for the uri and it worked :
<to id="requeue" uri="jmsamq:queue:{headers.reQueueName}"/> here is my implementation :
<route id="_throttleRoute">
<from id="throttleRouteStarter" uri="direct:throttleRouteService"/>
<log id="_Step_5" message="Camel throttle Route Started"/>
<log id="_Step_5_1" message="Camel throttle Route is ${headers.next}"/>
<to id="restThrottleCall" uri="restlet:http://host:port/path"/>
<process id="throttleRouteProcess" ref="throttleServiceProcessor"/>
<choice id="_choice2">`enter code here`
<when id="_when3">
<simple>${headers.next} == 'requeue'</simple>
<to id="requeue" uri="jmsamq:queue:{headers.reQueueName}"/>
<log id="_Step_wait1" message="ReQueue sending to ${headers.reQueueName}"/>
</when>
<when id="_when4">
<simple>${headers.next} == 'process'</simple>
<log id="_logNext" message="Invoking Next Work Unit ${headers.next}"/>
<process id="jBPMRouteProcess" ref="jBPMRouteProcessor"/>
</when>
<otherwise id="_otherwise2">
<log id="_log5" loggingLevel="WARN" message="Next for orderId: ${headers.orderid} not found"/>
</otherwise>
</choice>
</route>