使用Apache Camel我想将文件发送到ftp服务器,如果此服务器无法访问,那么我想将文件发送到备份ftp服务器。我用负载均衡器
来做<route id="ftp.failover">
<from uri="file:/path/to/files"/>
<loadBalance inheritErrorHandler="false">
<failover roundRobin="false" sticky="false"/>
<to uri="ftp://ftp_host"/>
<to uri="ftp://backup_ftp_host"/>
</loadBalance>
<log message="Sent ${headers}"/>
</route>
现在,我想在日志中看到每个文件发送到哪个ftp服务器,并且只有在发送时才会看到。很遗憾,我的<log />
消息并未显示有关目的地的任何信息。我想我需要在日志消息中添加一些$ {out.header.foo}但我无法想象我应该指定的标题名称而不是foo。
所以问题是:在apache camel的负载平衡情况下,有没有办法记录真实目的地?
更新:[解决方案]
感谢 Vimsha ,解决方案非常简单。我只想提一件事:CamelInterceptedEndpoint标头按原样填充而不进行消毒,因此如果存在于uri中,密码将变为可见。额外的日志条目也会略微污染日志文件。因此,我只需重写CamelInterceptedEndpoint标头而不是<log />
。
<interceptSendToEndpoint uri="ftp:*">
<setHeader headerName="CamelInterceptedEndpoint">
<simple>${headers.CamelInterceptedEndpoint.replaceAll("\?.*","")}</simple>
</setHeader>
</interceptSendToEndpoint>
在此之后,我的初始路线开始记录真实的目的地。
还可以简单地清理uri:
<setHeader headerName="CamelInterceptedEndpoint">
<javaScript>
org.apache.camel.util.URISupport.sanitizeUri(request.headers.get('CamelInterceptedEndpoint'))
</javaScript>
</setHeader>
可能有更方便的方法来调用camel的方法,但javascript对我来说更简单。
答案 0 :(得分:1)
为ftp端点添加拦截器并使用标头CamelInterceptedEndpoint
<interceptSendToEndpoint uri="ftp:*">
<log message="Sending to ${headers.CamelInterceptedEndpoint}"/>
</interceptSendToEndpoint>
您的完整路线将如下所示
<interceptSendToEndpoint uri="ftp:*">
<log message="Sending to ${headers.CamelInterceptedEndpoint}"/>
</interceptSendToEndpoint>
<route id="ftp.failover">
<from uri="file:/path/to/files"/>
<loadBalance inheritErrorHandler="false">
<failover roundRobin="false" sticky="false"/>
<to uri="ftp://ftp_host"/>
<to uri="ftp://backup_ftp_host"/>
</loadBalance>
<log message="Sent ${headers}"/>
</route>