我正在使用带有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的多播,然后一个端点是下载,另一个是无操作,但这没有看起来也很干净。
任何人都对如何干净利落地提出任何建议,我觉得我错过了一些非常简单的事情?
答案 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>