替换长URI来配置Spring bean的Camel端点?

时间:2014-10-02 20:59:54

标签: spring uri apache-camel javabeans endpoint

我试图找到一种使用spring bean配置Camel端点的方法,该bean在camel上下文中的路由中从端点声明引用,但它不起作用。

例如,有时定义具有许多参数的端点URI非常可怕(!!),使用bean及其属性配置端点要容易得多。 (或者甚至更好,当在XML中配置端点时,或者元素应该具有像常规bean这样的子元素,我们可以在其中配置端点的参数。)

下面的第一种方法运作良好,非常标准且非常简单。第二种方法是我想要使用的方法,但它不起作用。我试过很多变化,但没有成功!下面的第三个选择实际上对于Camel开发人员来说只是一个有趣的提议,但它也说明了我的观点。

在下面的示例中,我只为文件端点配置了3个参数,但想象一下带有10个参数的URI!我的问题是如何让我的第二种方法正常工作,我确信有一个简单的解决方案!?我也尝试过使用工厂bean和工厂方法,但它也不能用。

1)在XML(spring beans)中配置camel端点的标准方法:

...
<camel:camelContext id="camelContext"  >

    <camel:route id="deviceDataLogsPoller"  >
        <camel:from uri="file://long/path/to/input?preMove=../inprogress&amp;move=../done&amp;moveFailed=../error" />

        <camel:log message="Input device data file read from file in input folder {{im.filePoller.folder.input}}." loggingLevel="INFO" />

    </camel:route>
</camel:camelContext>

2)替代方案,我希望是valide,但这不起作用(对我来说!):

<bean id="filePoller" class="org.apache.camel.component.file.FileEndpoint" >

    <property name="camelContext" ref="camelContext" />
    <property name="localWorkDirectory" value="/long/path/to/input" />
    <property name="preMove"   value="../inprogress" />
    <property name="move"       value="../done" />
    <property name="moveFailed" value="../error" />
    ...
</bean>

...
<camel:camelContext id="camelContext"  >

    <camel:route id="deviceDataLogsPoller"  >
        <camel:from ref="filePoller" />

        <camel:log message="Input device data file read from file in input folder {{im.filePoller.folder.input}}." loggingLevel="INFO" />

    </camel:route>
</camel:camelContext>

3)将来会感兴趣的替代方案(在两个替代方案之间混合):

...     

    <camel:route id="deviceDataLogsPoller"  >
        <camel:from uri="file://long/path/to/input" >
             <property name="preMove"   value="../inprogress" />
             <property name="move"       value="../done" />
             <property name="moveFailed" value="../error" />
             ...
        </camel:from>

        <camel:log message="Input device data file read from file in input folder {{im.filePoller.folder.input}}." loggingLevel="INFO" />

    </camel:route>
</camel:camelContext>

2 个答案:

答案 0 :(得分:1)

什么对你不起作用?

以下设置按预期完成了工作:

<bean id="filePoller" class="org.apache.camel.component.file.FileEndpoint">
    <property name="file" value="src/data/bean-ref" />
    <property name="move" ref="moveExpression"/>
</bean>

<bean id="moveExpression" class="org.apache.camel.model.language.SimpleExpression">
    <constructor-arg value="${file:parent}/.done/${file:onlyname}" />
</bean>

<camelContext xmlns="http://camel.apache.org/schema/spring" id="camelContext">
    <route>
        <from ref="filePoller" />
        <log message="${body}" />
    </route>
</camelContext> 

注意:

  • 属性file是强制性的
  • 属性movemoveFailedpreMove不是java.lang.String类型,而是org.apache.camel.Expression类型,必须相应地进行初始化。
  • 属性moveExpression需要完整的文件表达式。如果仅使用.done而不是${file:parent}/.done/${file:onlyname},则文件将重命名为.done,而不会移至名为.done的目录。

答案 1 :(得分:0)

正如我在上一篇评论中所说,我能够为端点工作进行bean配置(参见上面的评论),但这种方法最终比简单地使用URI更复杂和沉重!

有一种方法可以配置端点,就像我在上面的第三个替代方案中提出的那样。也许如果我有时间,我会尝试创建自己的标签,通过从params元素构造完整的URI来包装现有的标签......!我也可以向Camel开发人员提出这个问题。

请参阅下面的示例,了解将来如何配置端点(或者使用我想要编写的XML包装器):

<camel:route id="deviceDataLogsPoller">

    <camel:from uri="file://long/path/to/input" >

         <param name="preMove"   value="../inprogress" />
         <param name="move"       value="../done" />
         <param name="moveFailed" value="../error" />
         ...
    </camel:from>

    ...

</camel:route>

不幸的是,目前无法实现如上所示的端点配置,但我认为这将是一件好事!目前,唯一的方法是将所有参数指定为一个非常长的URI中的参数,或者将端点配置为常规bean,具有它所暗示的所有复杂性(请参阅上面的注释以获取详细信息)。