【问题标题】:Unmarshalling an xml file downloaded from Amazon S3 with Camel使用 Camel 解组从 Amazon S3 下载的 xml 文件
【发布时间】:2015-06-28 01:49:10
【问题描述】:

我想从 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 条路线?不过,我只需要 1 条路线,从数据库到文件再到 S3,我就能够做到这一点。
  3. 在这种情况下我需要编写自己的转换器吗?

谢谢!

【问题讨论】:

    标签: apache-camel


    【解决方案1】:

    当您第二次访问 Camel 时,需要再次读取流,但它已关闭。它有时会变成流只能读取一次。它首先被读取到,您将其写入文件。

    因此,您可以启用流缓存以允许 Camel 能够再次重新读取流。在此常见问题解答和链接中查看更多信息

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

    from amq
    to file
    
    from file
    unmarshal 
    

    【讨论】:

    • 流媒体工作,但这意味着我对 .to() 从前一个端点读取的假设是错误的?由于我从 .from() 为第二个 .to() 缓存 S3 流,这意味着它从 .from() 中读取它,而不是从第一个 .to() 中创建的 xml 中读取它?
    • 该文件只是在写入文件,如果您对 http 进行了操作,那么它现在是消息正文的 http 服务器的响应
    猜你喜欢
    • 2012-10-10
    • 2012-08-29
    • 2013-05-08
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    • 2020-05-29
    • 2014-11-28
    相关资源
    最近更新 更多