Apache Camel - 动态地从端点构建端点

时间:2016-06-15 15:29:59

标签: apache jms apache-camel activemq endpoint

我有一条骆驼路线处理来自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我正在填充Iddestination server path。现在我需要定义一条消耗来自上传队列的消息的新路由,并复制一个本地文件夹(基于之前路由中生成的Id)并将其上传到目标文件夹,该文件夹是一个ftp服务器(这也填充在以前的路由中)< / p>

那么如何设计一个新的路由,其中​​from和endpoint都是动态的,看起来像下面的那样?

from("activemq:queue:upload" )
        .from("file:basePath/"+{idFromExchangeObject})
    .to("ftp:"+{serverIpFromExchangeObject}+"/"+{pathFromExchangeObject});

2 个答案:

答案 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}") 
  1. 参见内容丰富部分&#34;使用动态uris&#34; http://camel.apache.org/content-enricher.html

    您需要一个聚合策略,将原始交换与资源交换相结合,以确保标头serverIpFromExchangeObject,pathFromExchangeObject将在浓缩后包含在聚合交换中。如果您不包含自定义策略,则Camel将默认使用从资源获取的正文。查看content-enricher.html中的ExampleAggregationStrategy示例,了解其工作原理。

  2. 对于.toD(),请查看http://camel.apache.org/how-to-use-a-dynamic-uri-in-to.html