使用Camel

时间:2015-06-28 01:49:11

标签: apache-camel

我想从S3存储桶下载xml文件,然后解组它们以将数据插入数据库中:

...
from("aws-s3://myBucket?accessKey=xxx&secretKey=yyy")
.to("file:D:/output?fileName=${in.header.CamelAwsS3Key}")
.unmarshal(new JaxbDataFormat("com.xxx"))
...

当我不尝试解组时,我可以下载文件,但是当我尝试解组时出现此错误:

org.apache.camel.TypeConversionException:
Error during type conversion from type:
com.amazonaws.services.s3.model.S3ObjectInputStream to the required type:
javax.xml.stream.XMLStreamReader with value com.amazonaws.services.s3.model.S3ObjectInputStream@67b8328b due javax.xml.stream.XMLStreamException:
java.io.IOException: Attempted read on closed stream.  

由于我是Camel的新手,可能还有一些我不理解的事情......

  1. 当我管道端点时,当前端点是否以前一个端点“修改”它的方式获取消息呢?在我的情况下,它似乎正在编组S3流,而不是从下载本地新创建的xml文件,因此错误。
    我的理解是,如果我执行.from()。to()。to(),则第二个.to()不知道来自.from()的内容,所以如果我的第一个.to()创建一个xml文件,第二个.to()将消息作为xml文件处理。我错了吗?
  2. 也许我需要创建2条路线?我只能使用一条路线,从数据库到文件再到S3。
  3. 在这种情况下我是否需要编写自己的转换器?
  4. 谢谢!

1 个答案:

答案 0 :(得分:0)

当你有第二个到Camel需要再次读取流,但它关闭。有时候,流只能读一次。并且它在第一个中被读取,您将其写入文件。

因此,您可以启用流缓存,以允许Camel再次重新读取流。请参阅此常见问题解答和链接中的更多内容

你也可以把它分成2条路线

from amq
to file

from file
unmarshal