【问题标题】:Using Spring Integration to split a large XML file into individual smaller messages and process each individually使用 Spring Integration 将大型 XML 文件拆分为单独的较小消息并单独处理每个消息
【发布时间】:2012-08-07 22:28:41
【问题描述】:

我正在使用 Spring Integration 并且有一个包含子项集合的大型 XML 文件,我想将文件拆分为一组消息,每个消息的有效负载将是一个子 XML 片段。

使用 splitter 是显而易见的,但这需要返回一组消息,这会耗尽内存;我需要将文件拆分为单独的消息,但一次处理一条消息(或者更可能使用多线程任务执行器)。

是否有一种标准方法可以做到这一点,而无需编写以编程方式将子消息写入频道的自定义组件。

【问题讨论】:

  • 对于遇到这个非常古老的问题/答案的人。拆分器现在可以处理 IterableIteratorStream 类型的结果。如果返回任何这些类型,则每次发出一条消息。

标签: spring spring-integration splitter eai


【解决方案1】:

我一直在寻找类似的解决方案,但我还没有找到任何标准的方法来做到这一点。 如果有人需要实现此行为,这是一个相当肮脏的修复:

  1. 使用服务激活器或带有自定义 bean 的拆分器手动拆分文件。
<int:splitter input-channel="rawChannel" output-channel="splitChannel" id="splitter" >
  <bean class="com.a.b.c.MYSplitter" />
</int:splitter>
  1. 您的自定义 bean 应实现 ApplicationContextAware,以便 Spring 可以注入应用程序上下文。
  2. 手动检索输出通道并发送每个子消息
MessageChannel xsltChannel = (MessageChannel) applicationContext.getBean("splitChannel"); 
Message<String> message = new GenericMessage<String>(payload));

splitChannel.send(message);

【讨论】:

  • 对于遇到这个非常古老的问题/答案的人。拆分器现在可以处理IterableIteratorStream 类型的结果。如果返回任何这些类型,则每次发出一条消息。
  • 嗨@GaryRussell,感谢您的提醒!一个问题,既然这个特性支持哪个版本的 Spring Integration?
  • Iterator/Iterable 在 4.0.4(2014 年 9 月)中添加。 Stream/Flux 在 5.0.0 中添加(去年 11 月)。现在还有一个 FileSplitter emits file contents a line-at-a-time - 从 4.1.2 开始。
【解决方案2】:

对于遇到这个非常古老的问题的人。拆分器现在可以处理 IterableIteratorStreamFlux(项目反应器)类型的结果。如果返回任何这些类型,则每次发出一条消息。

Iterator/Iterable 从 4.0.4 开始; Stream/Flux 从 5.0.0 开始。

现在还有一个FileSplitter emits file contents a line-at-a-time 通过Interator - 从 4.1.2 开始。

【讨论】:

    猜你喜欢
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 2012-07-02
    • 2012-02-14
    • 2014-03-26
    相关资源
    最近更新 更多