具有动态标头的Camel端点

时间:2018-03-16 08:17:02

标签: apache apache-camel endpoint

我正在尝试通过端点发送sftp调用,并且需要将标头作为参数之一传递。有些人可以帮我解决这个问题。 我的路线看起来像这样

<route id="sftCall" autoStartup="true">
<from uri="sftp://{{host}}//{{Directory}}/${header.date}?password=banksftp.password}}&amp;privateKeyUri=//{{privateKeyUri}}&amp;scheduler=quartz2&amp;scheduler.cron={{Scheduler}}&amp;disconnect=true&amp;noop=true"/>
<log message="Ends...${header.CamelBatchSize}"/>
</route>

另一条路线就像

<route id="route">
<from uri="timer"/>
<setHeader headerName="date">
<simple>20170512</simple> 
</setHeader>
<to uri="direct:sftpCall"/>
</route>

感谢,,

2 个答案:

答案 0 :(得分:1)

您的设置存在多个问题。哪里开始最好?

  • 第一条路线是 SFTP轮询。这意味着只要给定目录中的sftp服务器上的新文件可用,它就会收到一条消息。那很好,但是......
  • 您的SFTP轮询器具有动态表达式作为子目录(${header.date})。据我所知,您在Camel路线中无法拥有动态from地址。因为这意味着您可以从多个端点消耗。
  • 在您的示例中,SFTP轮询器必须扫描服务器上的任何子目录。为此,您必须删除部分${header.date}并设置 recursive选项
  • 第二条路线是基于定时器的发送消息给direct:sftpCall。这意味着以from uri="direct:sftpCall"开头的路线。但你没有这样的路线

我想,对于<to uri="direct:sftpCall"/>,您要调用具有sftpCall作为路由ID的SFTP路由。但这根本不符合目的地路线。

  • direct是&#34;协议&#34; (同步内存中调用)。但您的目的地路线使用协议sftp
  • sftpCall是路由ID。您不能通过其ID(据我所知)调用路线

如果我的猜测是正确的并且您希望您的计时器路由触发您的sftp路由,则计时器路由必须将文件上传到sftp-server /目录sftp路线消耗。这只是看起来像这样。

<to uri="sftp://{{host}}//{{Directory}}..."/>

答案 1 :(得分:0)

你有2个误解

  
      
  1. 从端点定义
  2. 中使用标头   
  • 输入/输出标题是交换对象的一部分,交换对象是由现有路径(自然地)创建的
  • 创建路径后,from端点定义已修复

对于您的路由定义,${header.date}将用作硬代码字符串路径,因为当spring创建路径时没有交换对象。

  
      
  1. 使用直接组件
  2.   

direct组件用于连接相同camel上下文中的现有路由,而不是启动/构建另一个路由。

如果要将文件上传到sftp服务器,那么您只需要定时器路由并将sftp组件字符串粘贴到to端点定义中并使用{{3 }或toD代替to

如果从sftp服务器下载文件,则需要使用RouteBuilder创建路由,并使用Recipient List来启动/停止创建的路由。