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