通过通用查询提供程序访问Spring Batch作业/步骤详细信息

时间:2013-12-17 11:33:33

标签: spring-batch

我正在设置一个批处理作业,可以在三个数据库之间移动数据。我打算使用开箱即用的弹簧批处理类来处理来自第一个数据库的查询,但我想在提取中包含当前作业/步骤的详细信息。示例spring配置可能如下所示

<bean id="jdbcPagingItemReader" class="org.springframework.batch.item.database.JdbcPagingItemReader">   <property name="dataSource" ref="dataSource"/>
    <property name="pageSize" value="1000"/>
    <property name="fetchSize" value="100"/>
    <property name="queryProvider">
        <bean class="org.springframework.batch.item.database.support.HsqlPagingQueryProvider">
            <property name="selectClause" value="select id, bar"/>
                <property name="fromClause" value="foo"/>
                <property name="sortKeys">

有没有办法通过groovy或SpEL访问当前的JobExecution?我在access-spring-batch-job-definition上找到了这个帖子,但假定是自定义代码。

2 个答案:

答案 0 :(得分:1)

您的配置在sortKeys条目处被切断,因此我不能100%确定您要完成的操作。话虽这么说,使用步骤范围,您可以注入StepExecution,它引用了JobExecution。获得JobExecution看起来像这样:

<bean id="jdbcPagingItemReader" class="org.springframework.batch.item.database.JdbcPagingItemReader">
    …
    <property id="jobExecution" value="#{stepExecution.jobExecution}"/>
</bean>

答案 1 :(得分:1)

写入计数存在于步骤上下文(StepExecution.getWriteCount())中,因此首先需要将其提升为JobExecutionContext。

我建议使用带有@AfterStep注释的Step侦听器

@Component 
public class PromoteWriteCountToJobContextListener implements StepListener {
    @AfterStep
    public ExitStatus afterStep(StepExecution stepExecution){
        int writeCount = stepExecution.getWriteCount();
        stepExecution.getJobExecution().getExecutionContext()
        .put(stepExecution.getStepName()+".writeCount", writeCount);
        return stepExecution.getExitStatus();
    }   
}

执行插入的每个步骤都将添加此列表器

<batch:step id="readFromDB1WrietToDB2" next="readFroDB2WrietToDB3">
            <batch:tasklet transaction-manager="transactionManager">
                <batch:chunk reader="reader" writer="writter" />
            </batch:tasklet>
            <batch:listeners>
                <batch:listener ref="promoteWriteCountToJobContextListener"/>
            </batch:listeners>
    </batch:step>       
    <batch:step id="readFromDB2WrietToDB3" next="summerizeWrites">
            <batch:tasklet transaction-manager="transactionManager">
                <batch:chunk reader="reader"  writer="writter" />
            </batch:tasklet>
            <batch:listeners>
                <batch:listener ref="promoteWriteCountToJobContextListener"/>
            </batch:listeners>
    </batch:step>

您可以使用log4j将结果写入Step Listener中的日志,也可以在以后的步骤中使用保存的值。您需要使用SpEL表达式来读取它,使用SpEL表达式,您需要在 scope =“step”

上设置Writer / Tasklet
<batch:step id="summerizeWrites">
        <batch:tasklet id="summerizeCopyWritesTaskelt"">
            <bean class="Tasklet" scope="step">
                <property name="writeCountsList">   
                    <list>
                        <value>#{jobExecutionContext['readFromDB1WrietToDB2.writeCount']}</value>
                        <value>#{jobExecutionContext['readFromDB2WrietToDB3.writeCount']}</value>
                    </list>
                </property>
            </bean>
        </batch:tasklet>