【问题标题】:Putting output from a Spring Batch item writer onto a Spring Integration message channel将 Spring Batch 项目编写器的输出放入 Spring Integration 消息通道
【发布时间】:2014-01-21 07:53:05
【问题描述】:

从 Spring Batch 项目编写器获取输出(显然作为作业的一部分运行)并将其放置到 Spring Integration 消息通道的最佳方式是什么?我知道一种选择是编写一个 Spring Batch 侦听器(扩展 ItemWriteListener),该侦听器将被注入一个消息通道,然后将侦听器附加到批处理作业。还有其他选择吗?

【问题讨论】:

    标签: spring-batch spring-integration


    【解决方案1】:

    向ItemWriter 注入一个Spring Integration <gateway> 的选项:

    <int:gateway id="itemWriterGateway" service-interface="com.my.proj.MyGateway"/>
    
    
    class MyItemWriter implements ItemWriter<Foo> {
    
       @Autowired
       private MyGateway gateway;
    
       public void write(List<Foo> items) {
           for(Foo foo : items) {
               this.gateway.send(foo); 
           }
       }
    }
    

    另一个使用ItemWriterAdapter的选项:

    <bean id="myItemWriter" class="org.springframework.batch.item.adapter.ItemWriterAdapter">
        <property name="targetObject" ref="itemWriterGateway"/>
        <property name="targetMethod" value="send"/>
    </bean>
    

    我不会争辩说StepListener 可能对你也有价值。但是这里需要了解你想通过批处理作业使用 Spring Integration 来实现什么......

    更新

    实际上,Listener 不会帮助您,因为ItemWriter 不会返回任何内容,它会围绕底层资源封装其逻辑。

    正如您所说,您正在使用StaxEventItemWriter,它的Resource 是一些输出文件,也许有理由解耦您的逻辑并使用File 读取结果&lt;int-file:inbound-channel-adapter&gt;...

    更新 2

    ) 为什么听者不帮忙

    因为您需要ItemReader 的结果,否则您必须在来自items (ItemWriteListener#afterWrite) 的SI 流中再构建一次XML。

    StaxEventItemWriter 输出和入站适配器如何连接到内存中的资源?

    如果StaxEventItemWriter 要求它应该exists,你的resource 是如何在内存中的?

    从另一端,您可以与ItemWriter 和一些 SI 端点共享该资源。没错:您可以从 ChunkListener#afterChunk 执行此操作并从例如获取您的 resource jobParameters 并将其发送到 SI 网关。

    【讨论】:

    • 谢谢。我们使用 StaxEventItemWriter 作为项目编写器。我们如何将它与您提到的第二个选项 ItemWriterAdapter 结合起来?如果我们扩展 StaxEventItemWriter,第一个选项将网关注入到项目编写器中是可能的。侦听器是否会采用更清洁、更简单的方法?我们的要求:我们使用 Spring 批处理从数据库中读取,然后将结果输出为 xml。然后必须将该 xml 放在 Spring Integration 通道上以发送到外部进程。
    • 谢谢。两个问题:1)为什么监听器不提供帮助-Spring Batch 有一个 ItemWriteListener 接口,这在这里不合适吗? 2)使用 StaxEventItemWriter,将资源设置为文件并使用 Spring Integration file-inbound-channel-adapter 可能会起作用,但由于磁盘访问,它可能会非常低效。 StaxEventItemWriter 输出和入站适配器如何连接到内存中的资源?
    • 阿尔乔姆,谢谢。是否有替代 StaxEventItemWriter 的替代方法,例如创建一个 DOMResult,然后侦听器可以拾取该结果并将其放置在 Spring Integration 通道上?否则,这是否是一种可能的方法:使用调用 Spring OXM 编组器的项目处理器将 DOMResult 创建为字符串,并使用 JMS 项目编写器将其发送到外部进程(没有 Spring 集成)。
    • 1.不,我不知道StaxEventItemWriter 的任何替代方案。正如我在 Batch 源代码中看到的,没有其他 XML ItemWriters。实际上,您可以扩展StaxEventItemWriter 并覆盖createStaxResult() 并处理Result。 2.ItemProcessor。是的,即使没有 Spring 集成,您也始终可以实现自己的解决方案。
    猜你喜欢
    • 2019-05-19
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2019-05-06
    • 2018-05-30
    • 2019-06-29
    • 2017-04-29
    • 1970-01-01
    相关资源
    最近更新 更多