0

我想实现以下目标:

  • 给定 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

4

1 回答 1

1

它“正常工作”。

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

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

拆分器在每条消息上设置标题 ( correlationId, sequenceSize, )。sequenceNumber下游(默认)聚合器使用这些标头重新组装结果(默认发布策略是聚合组大小与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 中自定义代码;其余的应该只是流定义中的配置。

编辑2:

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

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" />

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

于 2014-12-02T20:18:29.127 回答