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



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

ItemWriter注入弹簧集成<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 集成实现的目标......

更新

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

正如您所说,您正在使用StaxEventItemWriter并且其Resource是某个输出文件,也许有理由解耦您的逻辑并使用<int-file:inbound-channel-adapter>File读取该结果......

更新 2

) 为什么听众不会提供帮助

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

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

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

另一方面,你可以与ItemWriter和一些 SI 端点共享该资源。对:你可以从ChunkListener#afterChunk那里做,并从中获取你的resource,例如jobParameters并将其发送到 SI 网关。

最新更新