我试图找到一种使用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&move=../done&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>
答案 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
是强制性的move
,moveFailed
和preMove
不是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,具有它所暗示的所有复杂性(请参阅上面的注释以获取详细信息)。