这涉及使用 JSR 作业,因此我无权使用作业规范中的 tasklet 定义。就工作规范而言,我得到的指示是仅支持 JSR 352 功能。
这是一个工作的例子:
<job id="xmlWriter" xmlns="http://xmlns.jcp.org/xml/ns/javaee" version="1.0">
<step id="firstStep">
<chunk item-count="2">
<reader ref="DelimitedFlatFileReader">
<properties>
<!-- Reads in from file Test.csv -->
<property name="fileNameAndPath" value="#{jobParameters['readerFileNameAndPath']}" />
<property name="fieldNames" value="firstName, lastName, city" />
<property name="fullyQualifiedTargetClass" value="com.test.test.DatabaseMember" />
</properties>
</reader>
<processor ref="com.test.test.ItemProcessor" />
<writer ref="FlatFileWriter" >
<properties>
<property name="appendOn" value="true" />
<!-- Read to file demoXMLReaderFlatFileWriterOutput.txt -->
<property name="fileNameAndPath" value="#{jobParameters['writerFileNameAndPath']}" />
<property name="fullyQualifiedTargetClass" value="com.test.test.DatabaseMember" />
</properties>
</writer>
</chunk>
</step>
在 ItemProcessor 中,我有兴趣拥有某种类型的回调/侦听器,如果块例如在写入步骤期间失败,它可以触发其中发生的事务项的回滚。
所以一个很好的例子是我在 ItemProcessor 中发生了某种 db 或 jms 操作。如果在块失败的编写器部分期间,我希望回滚在作为此迭代一部分的项目处理器期间发生的所有那些操作(或几个项目计数> 1)。
我已经研究了基于 jsr 规范的各种可用的侦听器,似乎没有任何东西允许这种类型的实现。此外,spring 似乎不像真正的 spring 批处理那样将处理器包装在事务中。我在创建数据库连接并测试它们以查看它们是否具有事务意识时所做的测试总是返回错误。
在完全自定义的实现之外,我正在寻找什至可能的东西,如果是的话,有任何关于如何完成它的指导。