【发布时间】:2014-01-21 07:53:05
【问题描述】:
从 Spring Batch 项目编写器获取输出(显然作为作业的一部分运行)并将其放置到 Spring Integration 消息通道的最佳方式是什么?我知道一种选择是编写一个 Spring Batch 侦听器(扩展 ItemWriteListener),该侦听器将被注入一个消息通道,然后将侦听器附加到批处理作业。还有其他选择吗?
【问题讨论】:
标签: spring-batch spring-integration
从 Spring Batch 项目编写器获取输出(显然作为作业的一部分运行)并将其放置到 Spring Integration 消息通道的最佳方式是什么?我知道一种选择是编写一个 Spring Batch 侦听器(扩展 ItemWriteListener),该侦听器将被注入一个消息通道,然后将侦听器附加到批处理作业。还有其他选择吗?
【问题讨论】:
标签: spring-batch spring-integration
向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 读取结果<int-file:inbound-channel-adapter>...
更新 2
) 为什么听者不帮忙
因为您需要ItemReader 的结果,否则您必须在来自items (ItemWriteListener#afterWrite) 的SI 流中再构建一次XML。
StaxEventItemWriter 输出和入站适配器如何连接到内存中的资源?
如果StaxEventItemWriter 要求它应该exists,你的resource 是如何在内存中的?
从另一端,您可以与ItemWriter 和一些 SI 端点共享该资源。没错:您可以从 ChunkListener#afterChunk 执行此操作并从例如获取您的 resource jobParameters 并将其发送到 SI 网关。
【讨论】:
StaxEventItemWriter 的任何替代方案。正如我在 Batch 源代码中看到的,没有其他 XML ItemWriters。实际上,您可以扩展StaxEventItemWriter 并覆盖createStaxResult() 并处理Result。 2.ItemProcessor。是的,即使没有 Spring 集成,您也始终可以实现自己的解决方案。