利用骆驼,通过服务内容丰富消息的正确方法是什么?

时间:2013-02-22 18:26:49

标签: java apache-camel

我正在使用带有Spring DSL的camel 2.10.3。

我正在监控CSV文件的目录。每个文件都包含有关下载内容的信息,以及其他元数据 - 谁请求下载等。

我使用该文件,现在我想使用HTTPComponent下载文件中引用的实体,然后将其保存到磁盘(稍后处理),如下所示:

<route>
  <from uri="file:/incoming"/>
  <unmarshall ref="csv"/>
  <recipientList><simple>${in.body[1]}</simple></recipientList>
  <to uri="file:/attachemnts"/>
  <to ref="furtherProcessing"/>
</route>

我正在使用recipientList,因为该URL是基于CSV文件内容的动态。上述方法不起作用,因为HTTPComponent尝试将交换的in.body(这是CSV文件内容的值)发送到HTTP服务。

我稍后需要处理CSV文件中的值,所以我不能把它们吹掉。我解决这个问题的第一个尝试是将CSV文件中的所有值移动到标题中,然后将主体设置为null,以便HTTPComponent不会抱怨(即使它没有抱怨,我仍然需要以某种方式保留原始CSV数据)。这种方法很有效,但是路线很混乱,有很多标题,我必须手动复制每一个标题。

似乎我需要有某种副作用来进行下载,我想到使用自定义aggregationStrategy的多播,然后一个端点是下载,另一个是无操作,但这没有看起来也很干净。

任何人都对如何干净利落地提出任何建议,我觉得我错过了一些非常简单的事情?

1 个答案:

答案 0 :(得分:3)

据我了解您的情况,您在CSV文件中有URL需要执行HTTP / GET操作,而请求中没有任何有效负载数据。

我会将邮件正文复制到交换属性中。由于解组的内容是List<List<String>>,因此您可以将其设置为属性,然后从整个属性中将其恢复。

像这样(我没有真正测试它,所以要注意语法类型-os)。

<route>
  <from uri="file:/incoming"/>
  <unmarshall ref="csv"/>
  <setProperty propertyName="originalData">  
     <simple>${body}</simple>  
  </setProperty>
  <setBody>
     <simple>null</simple><!-- will make HTTP use GET method and not send data -->
  </setBody>
  <recipientList><simple>${in.property.originalData[1]}</simple></recipientList>
  <to uri="file:/attachemnts"/>
  <to ref="furtherProcessing"/>
</route>