如何在apache camel

时间:2016-09-27 15:17:07

标签: logging apache-camel load-balancing

使用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对我来说更简单。

1 个答案:

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