带有Apache骆驼的多文件I / O

卡米卡兹(Kamikazzze)

我的要求如下:我需要解压缩文件并从解压缩的xml文件中读取元数据信息。这将在中完成xmlToObjectMapper现在,我需要使用位于zip文件中的多个其他xml的数据来丰富元数据。这意味着我必须将它们拆包阅读,然后将信息附加到我的MetadataHolder对象上。我想在注释行中实现这一点pollEnrich

from("file://{{first.directory}}?noop=true&idempotent=true")
        .split(new ZipSplitter())
            .streaming()
                .choice()
                    .when(header("zipFileName").isEqualTo("metadata.xml"))
                        .multicast()
                            .to("file://{{first.directory}}/Working?fileName=$simple{file:onlyname.noext}/${header.zipFileName}")
                            .pipeline()
                                .convertBodyTo(String.class, StandardCharsets.ISO_8859_1.name())
                                .bean("xmlToObjectMapper", "readAllRequiredMetadata")
                                //.pollEnrich("", 0, new MetadataHolderAggregationStrategy())
                            .end()
                        .end()
                .end()
            .to("file://{{first.directory}}/Working?fileName=$simple{file:onlyname.noext}/${header.zipFileName}")
        .end()
    .end()
    ;

但是现在我被卡住了,因为我得到了以下堆栈跟踪:

org.apache.camel.InvalidPayloadException: No body available of type: java.lang.String but has value: org.apache.camel.dataformat.zipfile.ZipInputStreamWrapper@2c52254b of type: org.apache.camel.dataformat.zipfile.ZipInpu
tStreamWrapper on: Message[id]. Caused by: Error during type conversion from type: java.lang.String to the required type: java.lang.String with value [Body is instance of java.io.I
nputStream] due java.io.IOException: Stream closed. Exchange[id]. Caused by: [org.apache.camel.TypeConversionException - Error during type conversion from type: java.lang.String to
 the required type: java.lang.String with value [Body is instance of java.io.InputStream] due java.io.IOException: Stream closed]

我以为多播会隐式缓存流并将其发送到所有端点...

有人能告诉我为什么会这样吗?我对需求的解决方案是有效的方法还是必须将需求分为多条路线?

编辑1:

我通过添加.streamCaching()到路由解决了异常的问题由于其他问题,我不得不稍微更改原始路线。

from("file://{{first.directory}}?noop=true&idempotent=true")
        .streamCaching()
        .split(new ZipSplitter())
            .streaming()
                .choice()
                    .when(header("zipFileName").isEqualTo("metadata.xml"))
                        .multicast()
                            .to("file://{{first.directory}}/Working?fileName=$simple{file:onlyname.noext}/${header.zipFileName}")
                            .pipeline()
                                .convertBodyTo(String.class, StandardCharsets.ISO_8859_1.name())
                                .bean("xmlToObjectMapper", "readAllRequiredMetadata")
                                .pollEnrich("file://{{second.directory}}?&noop=true&idempotent=true", 0, new MetadataHolderAggregationStrategy())
                            .end()
                        .end()
                    .endChoice()
                    .otherwise()
                        .to("file://{{first.directory}}/Working?fileName=$simple{file:onlyname.noext}/${header.zipFileName}")
                .end()
        .end()
    .end()
    ;

但是现在我遇到了问题pollEnrich我的newExchangeMetadataHolderAggregationStrategy始终为null。我该如何解决?

编辑2:

终于我找到了解决方案。我必须使用enrich代替pollEnrich并在java(readAllRequiredMetadata2)中实现整个I / O。我的最终解决方案如下所示:

from("file://{{first.directory}}?noop=true&idempotent=true")
        .streamCaching()
        .split(new ZipSplitter())
            .streaming()
                .choice()
                    .when(header("zipFileName").isEqualTo("metadata.xml"))
                        .multicast()
                            .to("file://{{first.directory}}/Working?fileName=$simple{file:onlyname.noext}/${header.zipFileName}")
                            .pipeline()
                                .convertBodyTo(String.class, StandardCharsets.ISO_8859_1.name())
                                .bean("xmlToObjectMapper", "readAllRequiredMetadata")
                                .enrich("direct:readResources", 0, new MetadataHolderAggregationStrategy())
                                //Go on processing the enriched metadata
                            .end()
                        .end()
                    .endChoice()
                    .otherwise()
                        .to("file://{{first.directory}}/Working?fileName=$simple{file:onlyname.noext}/${header.zipFileName}")
                .end()
        .end()
    .end()
    ;

from("direct:readResources")
   .bean("xmlToObjectMapper", "readAllRequiredMetadata2")
.end()
;
维亚切斯拉夫·埃尼斯(Vyacheslav Enis)

对于类似流的数据,您可能需要使用流缓存。默认情况下它是关闭的,因此第二个端点将不具有它,因为第一个端点已经读取了它。您可以在此处查看更多详细信息:http : //camel.apache.org/stream-caching.html

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

文件 I/O 有问题

来自分类Dev

带有sigaction()的I / O处理

来自分类Dev

Python I / O错误:如何为带有空格的文件路径修复此程序?

来自分类Dev

带有二进制数据的python文件I / O

来自分类Dev

Python I / O错误:如何为带有空格的文件路径修复此程序?

来自分类Dev

apache commons I / O。如何通过通配符过滤文件?

来自分类Dev

带有列表I / O的python多线程

来自分类Dev

带有异步I / O的消息排序(epoll)

来自分类Dev

带有 I/O 依赖项的单元测试

来自分类Dev

Apache骆驼同步文件路由

来自分类Dev

带有o(1)的数组

来自分类Dev

Python文件I / O

来自分类Dev

文件I / O实践。

来自分类Dev

带有“ -O,-to-stdout”的tar不能正确显示所有文件

来自分类Dev

apache骆驼多播和菜谱列表模式有什么区别?

来自分类Dev

带有Apache骆驼的FakeFtpServer-虚假用户甚至无法登录?

来自分类Dev

即使配置了组件选项,Apache骆驼连接池超时仍带有restlet

来自分类Dev

带有Apache骆驼的FakeFtpServer-伪造的用户甚至无法登录?

来自分类Dev

搜索有错误 I/O 错误的文件

来自分类Dev

Java I/O 文件中有多少个对象?

来自分类Dev

带有额外inputText的多文件上传

来自分类Dev

带有凭证文件的mount.cifs失败(错误2,没有这样的文件或目录),而-o username,password成功

来自分类Dev

C /符号中的const数组在带有nm的已编译* .o文件中不可见

来自分类Dev

系统调用“打开”无法创建带有O_CREAT标志的文件

来自分类Dev

C /符号中的const数组在带有nm的已编译* .o文件中不可见

来自分类Dev

如何使用bash获取带有fo o.bar名称的文件夹的大小?

来自分类Dev

带有O_CREATE标志的os.OpenFile不会抛出这样的文件或目录

来自分类Dev

C /符号中的const数组在带有nm的已编译* .o文件中不可见

来自分类Dev

GMP库-文件I / O

Related 相关文章

  1. 1

    文件 I/O 有问题

  2. 2

    带有sigaction()的I / O处理

  3. 3

    Python I / O错误:如何为带有空格的文件路径修复此程序?

  4. 4

    带有二进制数据的python文件I / O

  5. 5

    Python I / O错误:如何为带有空格的文件路径修复此程序?

  6. 6

    apache commons I / O。如何通过通配符过滤文件?

  7. 7

    带有列表I / O的python多线程

  8. 8

    带有异步I / O的消息排序(epoll)

  9. 9

    带有 I/O 依赖项的单元测试

  10. 10

    Apache骆驼同步文件路由

  11. 11

    带有o(1)的数组

  12. 12

    Python文件I / O

  13. 13

    文件I / O实践。

  14. 14

    带有“ -O,-to-stdout”的tar不能正确显示所有文件

  15. 15

    apache骆驼多播和菜谱列表模式有什么区别?

  16. 16

    带有Apache骆驼的FakeFtpServer-虚假用户甚至无法登录?

  17. 17

    即使配置了组件选项,Apache骆驼连接池超时仍带有restlet

  18. 18

    带有Apache骆驼的FakeFtpServer-伪造的用户甚至无法登录?

  19. 19

    搜索有错误 I/O 错误的文件

  20. 20

    Java I/O 文件中有多少个对象?

  21. 21

    带有额外inputText的多文件上传

  22. 22

    带有凭证文件的mount.cifs失败(错误2,没有这样的文件或目录),而-o username,password成功

  23. 23

    C /符号中的const数组在带有nm的已编译* .o文件中不可见

  24. 24

    系统调用“打开”无法创建带有O_CREAT标志的文件

  25. 25

    C /符号中的const数组在带有nm的已编译* .o文件中不可见

  26. 26

    如何使用bash获取带有fo o.bar名称的文件夹的大小?

  27. 27

    带有O_CREATE标志的os.OpenFile不会抛出这样的文件或目录

  28. 28

    C /符号中的const数组在带有nm的已编译* .o文件中不可见

  29. 29

    GMP库-文件I / O

热门标签

归档