我想设置一个基本步骤,附加一个记录器监听器,以确保所有错误日志最终都在正确的文件中。
下面的设置非常简单,与http://static.springsource.org/spring-batch/reference/html/configureStep.html#mergingListsOnStep上提供的示例相似,但根据http://www.springframework.org/schema/batch/spring-batch.xsd,似乎听众不属于步骤,而是属于tasklet。
<step id="baseLoggedStep">
<listeners>
<listener>
<bean class="org.example...StepLogListener"/>
</listener>
</listeners>
</step>
<step id="myJobStep" parent="baseLoggedStep">
...
</step>
那么,谁是正确的,我如何使用正确的xsd来产生所需的结果?
以下基本步骤似乎可以解决问题,其中StepLogListener侦听器实现了StepExecutionListener。
<batch:step id="baseLoggedStep" abstract="true">
<batch:tasklet>
<batch:listeners>
<batch:listener ref="stepLogListener">
<bean class="com.bossmedia.gem.platform.batch.StepLogListener"/>
</batch:listener>
</batch:listeners>
</batch:tasklet>
</batch:step>
然而,它似乎不是最佳的,坦率地说并不完全正确。这意味着baseLoggedStep是TaskletStep的抽象实例吗?
答案 0 :(得分:1)
根据Spring Batch 2.1 XSD所有你需要做的就是让你的第一个baseLoggedStep步骤示例摘要(参见5.1.2.1. Abstract Step)。
请注意,如果您的子作业添加了自己的侦听器,则必须将它们合并(请参阅5.1.2.2. Merging Lists),否则将忽略抽象父步骤中的侦听器。
答案 1 :(得分:1)
刚刚将这个Spring Batch Step Execution Listener的例子放在那里,因为我没有在网上找到一个好的。另外,Spring参考示例不会按照书面形式运行。
<beans:bean id="customStepExecutionListener" class="com.foo.MyCustomStepExecutionListener" />
<beans:bean id="customJobExecutionListener" class="com.foo.MyCustomJobExecutionListener" />
<!-- Abstract step listener must be defined outside job -->
<step id="abstractListeningStep" abstract="true">
<!-- Must be inside tasklet, but tasklet does not affect firing order -->
<tasklet>
<listeners>
<listener ref="customStepExecutionListener" />
</listeners>
</tasklet>
</step>
<!-- The job -->
<job id="myJob">
<description>My Job</description>
<listeners>
<!-- Any job specific listeners here -->
<listener ref="customJobExecutionListener" />
</listeners>
<!-- Start here -->
<step id="myFirstStep" parent="abstractListeningStep">
<!-- Your work/jobs/tasklets here -->
</step>
</job>