【问题标题】:Camel Endpoint with dynamic header带有动态标头的骆驼端点
【发布时间】:2018-03-16 08:17:01
【问题描述】:

我正在尝试通过端点发送 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>

谢谢,,

【问题讨论】:

  • 试试这个&lt;route id="route"&gt; &lt;from uri="timer"/&gt; &lt;setHeader headerName="date"&gt; &lt;simple&gt;20170512&lt;/simple&gt; &lt;/setHeader&gt; &lt;to uri="direct:sftpCall"/&gt; &lt;/route&gt;
  • sorry pvpkiran 我不好,无论你建议我如何使用以及我从 uri 设置标题的问题
  • 您的意思是说,在您的 sftpCall 路由中,您无法访问您在其他路由中设置的日期标题?而不是可变日期尝试使用其他东西。例如我的日期
  • 我试过了,但没有解决我的问题
  • 您介意解释一下现在发生的事情吗?你的 sftpCall 路由被调用了吗?

标签: apache apache-camel endpoint


【解决方案1】:

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

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

我猜想使用&lt;to uri="direct:sftpCall"/&gt; 你想调用以sftpCall 作为路由ID 的SFTP 路由。但这根本不符合目的地路线。

  • direct 是“协议”(同步内存调用)。但是您的目标路由使用协议sftp
  • sftpCall 是一个路由 ID。您不能通过 ID 调用路由(据我所知)

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

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

【讨论】:

  • 谢谢 burki,这让我澄清了我的问题,我需要知道的一件事我可以直接致电 像这样,在 sftp 端点中有 header.xxx
【解决方案2】:

你有两个误解

  1. 在端点定义中使用标头
  • In/Out 标头是交换对象的一部分,交换对象是由现有路由创建的(自然)
  • 一旦创建路由,from 端点定义就固定了

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

  1. 使用直接组件

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


如果您将文件上传到 sftp 服务器,那么您只需要计时器路由并将您的sftp 组件字符串粘贴到to 端点定义中并使用toDRecipient List而不是to

如果您是从 sftp 服务器下载文件,那么您需要使用 RouteBuilder 来创建路由并使用ControlBus 来启动/停止创建的路由。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-10
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多