Apache Camel的Enrich EIP如何处理文件端点?

时间:2014-12-04 20:16:38

标签: apache-camel apache-servicemix blueprint-osgi

我正在尝试通过编写使用各种EIP的简单路由来学习如何使用Apache Camel。我的导师建议Apache ServiceMix作为测试简单路由的好服务器,所以我使用的是Apache ServiceMix 5.1.0。目前,我正在尝试创建一个从文件读取请求的路由,用来自第二个文件的响应替换请求的内容,并将该响应写入第三个文件。

理想情况下,第二个文件不会被删除;我最终希望在其他自学教程路由中使用此模式,第二个文件将模仿Web服务的响应。但是,我现在只是想让它工作,所以我不会使noop等选项变得复杂。

如果我正确读取the Apache Camel Wiki page for the Content Enricher,则从enrich EIP中省略聚合策略将使Camel丢弃消息的内容并将其替换为从资源获取的正文。所以,我认为这个Camel Route会做我想做的事情:

<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
    xmlns:camel="http://camel.apache.org/schema/blueprint" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
       http://camel.apache.org/schema/blueprint http://camel.apache.org/schema/blueprint/camel-blueprint.xsd">

    <camelContext xmlns="http://camel.apache.org/schema/blueprint">
        <route>
            <from uri="file:camel/inMessage/?fileName=replaceMe.txt" />
            <enrich uri="file:camel/storedResponse/?fileName=withThis.txt" />
            <to uri="file:camel/outMessage/?fileName=output.txt" />
        </route>
    </camelContext>

</blueprint>

实际发生的是camel/storedResponse/withThis.txt的内容被camel/inMessage/replaceMe.txt的内容替换。文件camel/outmessage/output.txt已创建,但其中包含replaceMe.txt的内容,而不是withThis.txt

由于我还是Camel的新手,我认为问题只是我误读了文档中的内容,或忽略了明显的配置问题。

对于它的价值,这里是开始路线之前文件的内容。

replaceMe.txt
This is the message sent. It should not appear in the response.

withThis.txt
This is the file stored in the server. The response should contain this text.

output.txt does not yet exist.

以下是路线完成后文件的内容。

replaceMe.txt has been deleted.

withThis.txt
This is the message sent. It should not appear in the response.

output.txt
This is the message sent. It should not appear in the response.

感谢您的时间。

2 个答案:

答案 0 :(得分:2)

来自Camel doc

  

rich 使用Producer获取其他数据。它通常用于请求回复消息传递,例如用于调用外部Web服务。另一方面, pollEnrich 使用轮询消费者来获取其他数据。它通常用于事件消息消息传递,例如读取文件或下载FTP文件。

如果使用enrich,那么withThis.txt的内容将替换为replaceMe.txt的内容,而这不是您想要的。请改用pollEnrich

 <pollEnrich uri="file:camel/storedResponse/?fileName=withThis.txt" />

答案 1 :(得分:-1)

丰富像a的作品 你的路线实际上是从replaceMe.txt收到的body到withThis.txt,而不会改变身体的任何东西。因此最终结果 pollEnrich需要用于实际读取来自withThis.txt