使用Spring Integration将大型XML文件拆分为单个较小的消息并单独处理每个消息

时间:2012-08-10 15:24:23

标签: spring spring-integration splitter eai

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

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

有没有一种标准的方法可以在不编写以编程方式将子消息写入通道的自定义组件的情况下执行此操作。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

自4.0.4以来

Iterator/Iterable;自5.0.0以来Stream/Flux

自4.1.2以来,现在还有一个FileSplitter emits file contents a line-at-a-time来自Interator