2016-09-27 44 views
0

使用Apache Camel我想将文件发送到FTP服务器,如果此服务器变得无法访问,那么我想发送文件到备份FTP服务器。我与负载平衡器如何在Apache骆驼中记录负载均衡器的真正目标端点

<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驼峰的负载平衡?

修订:[溶液]

由于Vimsha,溶液呈简单。我只想提到一件事情:CamelInterceptedEndpoint头像没有消毒一样填充,以便密码在uri中显示。额外的日志条目也轻微污染日志文件。所以,而不是<log />我只是重写CamelInterceptedEndpoint标题。

<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> 

可能有调用骆驼的方法,但JavaScript的更方便的方法更简单给我。

+0

我没有看到任何头被负载均衡器设置日志。一个简单的方法是将你的两个目的地作为微小的“直接”路线包装,分两步进行:logging和ftp。 –

回答

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>