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

Spring batch 通过通用查询提供程序访问Spring批处理作业/步骤详细信息,spring-batch,Spring Batch,我正在设置一个在三个数据库之间移动数据的批处理作业。我计划使用开箱即用的spring批处理类来处理来自第一个数据库的查询,但我希望在摘录中包含当前作业/步骤的详细信息。示例spring配置可能如下所示 <bean id="jdbcPagingItemReader" class="org.springframework.batch.item.database.JdbcPagingItemReader"> <property name="dataSource" ref="dat

我正在设置一个在三个数据库之间移动数据的批处理作业。我计划使用开箱即用的spring批处理类来处理来自第一个数据库的查询,但我希望在摘录中包含当前作业/步骤的详细信息。示例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访问当前的作业执行?我在上找到此线程,但它是自定义代码

您的配置在sortKeys条目处被切断,因此我无法100%确定您想要完成什么。也就是说,使用step作用域,您可以注入包含对JobExecution的引用的StepExecution。获取作业执行将如下所示:

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

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

我建议为此使用带有@AfterStep注释的步骤侦听器

@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();
    }   
}
执行插入的每个步骤都将与此listner一起添加

<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将结果写入步骤侦听器中的日志,也可以在以后的步骤中使用保存的值。您需要使用SpEL表达式来读取它,要使用SpEL表达式,您需要将writer/Tasklet设置为scope=“step”



您试图在何处包含有关当前作业/步骤的信息?我有一个功能请求,它说用户想知道在同一个作业期间有多少行插入到不同的数据库中。有几种方法可以做到这一点,但我目前正在考虑的选择是使用spring批处理作业id,这将允许我将报告链接回spring批处理管理员。我想这可能是您的问题。简单地说,这是不可能的。[1]:
<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>