【问题标题】:Spring XD: Pipe chain with split, join and local executionSpring XD:具有拆分、连接和本地执行的管道链
【发布时间】:2014-12-02 19:23:31
【问题描述】:

我想实现以下目标:

  • 给定一个 URL 列表(png 图像),并行下载文件(拆分)
  • 在并行进程中转换下载文件的文件格式(例如 png2jpg in.png out.jpg)
  • 等到所有文件都转换完毕,然后将所有文件提取到一个单个位置并对它们进行最终操作(例如,从所有图像创建一个巨大的马赛克图像)

图像转换作为示例提供。我的处理实际上更复杂,但我试图通过我需要拆分文件处理以及我需要对连接操作后进行最终处理来满足要求。

我对 Spring XD 管道的链接方式有一个基本的了解(类似于壳管道)。有一个拆分器和一个聚合器。我的期望是我可以将文件作为对象传递到下一个管道。

但是,二进制对象、集合和拆分/聚合操作如何在 XD 中一起发挥作用?

如果您能给我提供一个工作示例(例如,为了简单起见而不是转换触发 shell 任务“cat file1 file2 > outputfile”),这对我很有帮助。

[1]https://github.com/spring-projects/spring-xd/wiki/Processors#splitter

【问题讨论】:

    标签: spring spring-batch spring-xd


    【解决方案1】:

    它“正常工作”。

    XD在封面下使用Spring Integration;请参阅其有关拆分器/聚合器的文档。

    Spring Integration 消息具有标头和有效负载;框架对有效载荷一无所知;它可以是你想要的任何东西。大概您将从一个 URL 列表开始,拆分它们,调用 http 来获取每个 URL 的 PNG 内容。调用一些服务进行转换并将结果发送到聚合器。

    拆分器在每条消息上设置标题(correlationIdsequenceSizesequenceNumber)。下游(默认)聚合器使用这些标头重新组装结果(默认发布策略是聚合组大小与 sequenceSize 标头匹配)。在您的情况下,结果将是 Collection 的图像;聚合器之后的最终自定义处理器可以将该列表转换为您的最终马赛克。

    编辑:

    source | splitter | http-client | processor1 | aggregator | processor2 | file
    

    地点:

    source - generates list of URLs
    http-client - fetches the PNGs (binary payloads)
    processor1 - convert to JPG
    processor2 - create mosaic
    

    您需要在源代码、处理器1 和处理器2 中自定义代码;其余的应该只是流定义中的配置。

    EDIT2:

    您可能希望这是事件驱动的,所以也许这样会更好:

    http | json-to-object | splitter | http-client | processor1 | aggregator | processor2 | file
    

    并将您的 URL 列表作为 JSON 发布。

    如果您确实想要一个轮询源,则可以使用类似于触发源的自定义源...

        <int:inbound-channel-adapter channel="output"
            auto-startup="false" ref="myPojo" method="foo">
            <int:poller fixed-delay="${fixedDelay}" time-unit="SECONDS" />
        </int:inbound-channel-adapter>
    
        <bean id="myPojo" class="foo.UrlGenerator" />
    

    如果没有要处理的内容或 URL 列表,则让 foo() 返回 null。

    【讨论】:

    • 你能提供一个小例子来说明生成源集合吗?
    • 似乎没有 json-to-object。它应该做什么?
    • 目前还没有标准的 XD json-to-object 处理器,但创建一个很容易;类似于object-to-json,但在Spring Integration 中使用&lt;int:json-to-object-transformer/&gt;Docs here - 向下滚动到 JSON。
    • 没有理由使用json-to-objectsplitter 可以简单地接受 --expression="#jsonPath(payload, '$.*')",如果你的 JSON 是一个 URL 数组,当然...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-29
    相关资源
    最近更新 更多