我有一条骆驼路线处理来自process queue
的邮件并将其发送到upload queue
。
from("activemq:queue:process" ).routeId("activemq_processqueue")
.process(exchange -> {
SomeImpl impl = new SomeImpl();
impl.process(exchange);
})
.to(ExchangePattern.InOnly, "activemq:queue:upload");
在impl.process
我正在填充Id
和destination server path
。现在我需要定义一条消耗来自上传队列的消息的新路由,并复制一个本地文件夹(基于之前路由中生成的Id)并将其上传到目标文件夹,该文件夹是一个ftp服务器(这也填充在以前的路由中)< / p>
那么如何设计一个新的路由,其中from和endpoint都是动态的,看起来像下面的那样?
from("activemq:queue:upload" )
.from("file:basePath/"+{idFromExchangeObject})
.to("ftp:"+{serverIpFromExchangeObject}+"/"+{pathFromExchangeObject});
答案 0 :(得分:2)
在Camel中添加动态到端点(如注释中所述)可以使用.toD()
来完成fromD()
我不知道任何addRoutes
等价物。但是,您可以通过调用CamelContext
上的public void process(Exchange exchange) throws Exception {
String idFromExchangeObject = ...
String serverIpFromExchangeObject = ...
String pathFromExchangeObject = ...
exchange.getContext().addRoutes(new RouteBuilder() {
public void configure() {
from("file:basePath/"+ idFromExchangeObject)
.to("ftp:"+ serverIpFromExchangeObject +"/"+pathFromExchangeObject);
}
});
}
方法添加动态路由。这在on this page on the Camel site.
稍微扩展Camel网站上的示例,这将使您朝着正确的方向前进。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<context:component-scan base-package="com.niit.musicstore" />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix">
<value>/WEB-INF/views/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
</beans>
Camel中可能还有其他选项,因为这个框架具有惊人数量的EIP和功能。
答案 1 :(得分:2)
我认为你的情况有一个更好的选择,理所当然地认为你使用的是比2.16更新的Camel版本。(以前版本的替代版本存在,但更复杂,看起来不优雅 - (例如consumerTemplate&amp; recipientList)。
您可以替换&#34;中的第一个&#34;动态使用pollEnrich,它使用轮询使用者和简单表达式来构建动态文件端点来丰富消息。对于第二部分,如前所述,动态的uri .toD将完成这项工作。所以你的路线看起来像这样:
from("activemq:queue:upload" )
.pollEnrich().simple("file:basePath/${header.idFromExchangeObject})
.aggregationStrategy(new ExampleAggregationStrategy()) // * see explanation
.timeout(2000) // the timeout is optional but recommended
.toD("ftp:${header.serverIpFromExchangeObject}/${header.pathFromExchangeObject}")
参见内容丰富部分&#34;使用动态uris&#34; http://camel.apache.org/content-enricher.html。
您需要一个聚合策略,将原始交换与资源交换相结合,以确保标头serverIpFromExchangeObject,pathFromExchangeObject将在浓缩后包含在聚合交换中。如果您不包含自定义策略,则Camel将默认使用从资源获取的正文。查看content-enricher.html中的ExampleAggregationStrategy示例,了解其工作原理。