4

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

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

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

4

2 回答 2

1

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

  1. 使用 Service Activator 或带有自定义 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);
于 2014-03-25T03:05:30.987 回答
1

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

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

从 4.1.2 开始,现在还有一个通过-一次一行地发出文件内容的功能FileSplitterInterator

于 2018-01-27T19:25:26.917 回答