如何在From()中使用动态URI

Sid*_*ale 5 apache ftp apache-camel camel-ftp

Apache Camel中所述,它允许在To()中编写动态URI,它是否允许在From()中编写动态URI.因为我需要调用多个FTP位置来根据配置下载文件,我将把它存储在数据库中.

(FTPHost, FTPUser, FTPPassword, FTPSourceDir, FTPDestDir)
Run Code Online (Sandbox Code Playgroud)

我将从DB中读取这些配置,并在运行时动态地将其传递给Camel路由.

示例: 这是我必须动态编写的camel路由示例

<Route>
    <from uri="ftp://${ftpUser}@${ftpHost}:${ftpPort}/${FTPSourceDir}?password=${ftpPassword}&delete=true"/>
    <to uri="${ftpDestinationDir}"/>
</Route>
Run Code Online (Sandbox Code Playgroud)

正如您在示例中看到的,我需要动态传递这些提到的参数.那么如何在From()中使用动态uri

Gna*_*uru 6

您可以从属性文件中读取它,如下所示,

<bean id="bridgePropertyPlaceholder" class="org.apache.camel.spring.spi.BridgePropertyPlaceholderConfigurer">
    <property name="location" value="classpath:/config/Test.properties"/>
  </bean> 

<Route>
    <from uri="ftp://{{ftpUser})@${{ftpHost}}:{{ftpPort}}/${{FTPSourceDir}}?password={{ftpPassword}}&delete=true"/>
    <to uri="{{ftpDestinationDir}}"/>
</Route>
Run Code Online (Sandbox Code Playgroud)

ftpUser,ftpHost .... - 都是在Test.properties中声明的键

如果您想动态地从交换中获取这些变量,则不能像您在示例中提到的那样以常规方式执行此操作.您必须使用消费者模板,如下所示,

Exchange exchange = consumerTemplate.receive("ftp:"+url);
producerTemplate.send("direct:uploadFileFTP",exchange );
Run Code Online (Sandbox Code Playgroud)

你必须从春豆或骆驼制作人那里做到这一点.使用者模板将使用给定的组件,该生产者模板将调用camel-context.xml中声明的直接组件

注意:消费者和生产者模板成本很高.你可以将两者注入弹簧容器中,让弹簧处理生命周期.


Gna*_*uru 5

从camel 2.16 on-wards,我们可以使用pollenrich组件定义轮询消费者,如文件,ftp..etc,动态url /参数值,如下所示

<route>
  <from uri="direct:start"/>
  <pollEnrich>
    <simple>file:inbox?fileName=${body.fileName}</simple>
  </pollEnrich>
  <to uri="direct:result"/>
</route>
Run Code Online (Sandbox Code Playgroud)

它真棒!

请参阅:http://camel.apache.org/content-enricher.html