Spring XD:具有拆分,连接和本地执行的管道链

时间:2014-12-02 19:23:31

标签: spring spring-batch spring-xd

我想实现以下目标:

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

提供图像转换作为示例。我的处理实际上更复杂,但我试图通过我需要分割文件处理来获得要求,并且我需要在连接操作之后对其进行最终处理。

我有一个基本的想法是如何链接Spring XD管道(类似于shell管道)。有一个分离器和一个聚合器。我的期望是我可以将文件作为对象传递给下一个管道。

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

如果您能为我提供一个有用的示例(例如,而不是为了简单而转换,则触发shell任务“cat file1 file2> outputfile”)对我非常有用。

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

1 个答案:

答案 0 :(得分: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

并将您的网址列表发布为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()返回null。