Apache Camel 基于文件内容的动态路由
Apache Camel dynamic route based on file content
我正在尝试使用 apache camel 将文件内容路由到 activemq 队列。我使用 camel 从特定文件夹中轮询 xml 文件,然后将其内容发送到队列。我的问题是我想根据内容值将内容发送到动态队列名称。例如:
xml 文件内容为
<name="queue1"/>
那就意味着这个需要发送到名为"queue1"的队列。如何在骆驼路线 spring dsl 中将 "queue1" 动态值用于 "to:" 参数?
谢谢
假设你有一个 xml-document,你可以使用 xpath 提取信息并将其设置在一个 header 中,你可以使用简单的
获得
http://camel.apache.org/simple.html
http://camel.apache.org/xpath.html
http://camel.apache.org/recipient-list.html
@EndpointInject(uri = "direct:start")
private ProducerTemplate start;
@EndpointInject(uri = "mock:result1")
private MockEndpoint result1;
@Test
public void testName3() throws Exception {
context.addRoutes(new RouteBuilder() {
@Override
public void configure() throws Exception {
from("direct:start")
.setHeader("address", xpath("/address/text()", String.class))
.recipientList(simple("mock:${header.address}"));
}
});
result1.expectedMessageCount(1);
start.sendBody("<address>result1</address>");
result1.assertIsSatisfied();
}
我认为最好的方法是将该名称保存到 header,如本例所示:
https://whosebug.com/a/9637840/3703819
然后在 Endpoint 中使用 Simple 表达式,如下所示:
<recipientList>
<simple>activemq:queue:${headers.dest}</simple>
</recipientList>
我正在尝试使用 apache camel 将文件内容路由到 activemq 队列。我使用 camel 从特定文件夹中轮询 xml 文件,然后将其内容发送到队列。我的问题是我想根据内容值将内容发送到动态队列名称。例如:
xml 文件内容为
<name="queue1"/>
那就意味着这个需要发送到名为"queue1"的队列。如何在骆驼路线 spring dsl 中将 "queue1" 动态值用于 "to:" 参数?
谢谢
假设你有一个 xml-document,你可以使用 xpath 提取信息并将其设置在一个 header 中,你可以使用简单的
获得http://camel.apache.org/simple.html
http://camel.apache.org/xpath.html
http://camel.apache.org/recipient-list.html
@EndpointInject(uri = "direct:start")
private ProducerTemplate start;
@EndpointInject(uri = "mock:result1")
private MockEndpoint result1;
@Test
public void testName3() throws Exception {
context.addRoutes(new RouteBuilder() {
@Override
public void configure() throws Exception {
from("direct:start")
.setHeader("address", xpath("/address/text()", String.class))
.recipientList(simple("mock:${header.address}"));
}
});
result1.expectedMessageCount(1);
start.sendBody("<address>result1</address>");
result1.assertIsSatisfied();
}
我认为最好的方法是将该名称保存到 header,如本例所示: https://whosebug.com/a/9637840/3703819
然后在 Endpoint 中使用 Simple 表达式,如下所示:
<recipientList>
<simple>activemq:queue:${headers.dest}</simple>
</recipientList>