Spring batch 将Spring批处理项编写器的输出放入Spring集成消息通道

Spring batch 将Spring批处理项编写器的输出放入Spring集成消息通道,spring-batch,spring-integration,Spring Batch,Spring Integration,从Spring批处理项编写器(显然是作为作业的一部分运行)获取输出并将其放到Spring集成消息通道上的最佳方法是什么?我知道一个选项是编写一个Spring批处理侦听器(扩展ItemWriteListener),它将被注入一个消息通道,然后将侦听器附加到批处理作业。还有其他选项吗?有一个选项可以向ItemWriter注入Spring集成: 我不认为StepListener对您也有价值。但这里需要了解您想要从批处理作业中使用Spring集成实现什么 更新 实际上,Listener对您没有帮助,因为

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

有一个选项可以向
ItemWriter
注入Spring集成

我不认为
StepListener
对您也有价值。但这里需要了解您想要从批处理作业中使用Spring集成实现什么

更新

实际上,
Listener
对您没有帮助,因为
ItemWriter
不返回任何内容,它将其逻辑封装在底层资源周围

正如您所说,您正在使用的是
statxeventitemwriter
,其
资源是某个输出文件,可能有理由将逻辑解耦,并使用
读取结果
文件

更新2

)为什么听众不帮忙

因为您需要
ItemReader
的结果,否则您必须从
items
ItemWriteListener\afterWrite
)在SI流中再次构建XML

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

如果
StateVentitemWriter
要求
资源存在,那么您的
资源在内存中是如何存在的


从另一端,您可以
ItemWriter
和一些SI端点共享该资源。正确:您可以从
ChunkListener#afterChunk
执行此操作,并从中获取
资源,例如
作业参数
并将其发送到SI网关。

谢谢。我们正在使用StateEventItemWriter作为项目编写器。我们如何将其与您提到的第二个选项ItemWriterAdapter相结合?第一个选项是将网关注入项编写器,如果我们扩展StateVentitemWriter,那么就可以使用它。听众是否倾向于更干净、更简单的方式?我们的需求:我们使用SpringBatch从数据库中读取数据,然后将结果输出为xml。然后,必须将该xml放在Spring集成通道上,才能发送到外部进程。谢谢。两个问题:1)为什么监听器没有帮助-Spring批处理有一个ItemWriteListener接口,这在这里不合适吗?2) 使用StaxEventItemWriter,将资源设置为文件并使用Spring集成文件入站通道适配器可能会起作用,但由于磁盘访问的原因,这可能会非常低效。StateVentitemWriter输出和入站适配器如何连接到内存中的资源?Artem,谢谢。是否有一种替代StatxeventitemWriter的方法可以创建一个DOMResult(例如,侦听器可以拾取它并将其放在Spring集成频道上)?否则,这是一种可能的方法:使用一个调用Spring OXM marshaller的项目处理器以字符串形式创建DOMSResult,并使用JMS项目编写器将其发送到外部进程(无Spring集成)。1。不,除了
statxeventitemwriter
之外,我不知道还有什么其他选择。正如我在批处理源代码中看到的,没有其他XML
ItemWriter
s。实际上,您可以扩展
statxeventitemwriter
并重写
createStatxResult()
并处理该
Result
。2. <代码>项目处理器
。是的,您始终可以实现自己的解决方案,即使没有Spring集成。
<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); 
       }
   }
}
<bean id="myItemWriter" class="org.springframework.batch.item.adapter.ItemWriterAdapter">
    <property name="targetObject" ref="itemWriterGateway"/>
    <property name="targetMethod" value="send"/>
</bean>