从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 网关。