Spring JdbcCursorItemReader 在 spring 批处理应用程序中

Spring JdbcCursorItemReader in spring batch application

我的用例如下: 有一个员工table,列如下:

employee_id;
empoyee_dob;
employee_lastName;
employee_firstName;
employee_zipCode

现在有一个用例来构建部门 'A' 和邮政编码 11223 的员工以及部门 B 和邮政编码 33445 的员工列表。

我已经配置了一个 spring 作业如下:

<batch:job id="EmployeeDetailsJob" job-repository="EmpDaoRepository">
        <batch:step id="loadEmployeeDetails" >
            <batch:tasklet transaction-manager="EmployeeDAOTranManager">
                <batch:chunk reader="EmpDaoJdbcCursorItemReader" writer="EmpDaoWriter" commit-interval="200" skip-limit="100">
                  <batch:skippable-exception-classes>
                  </batch:skippable-exception-classes>
                </batch:chunk>
                <batch:listeners>
                    <batch:listener ref="EmpDaoStepListener" />
                </batch:listeners>
                <batch:transaction-attributes isolation="DEFAULT" propagation="REQUIRED" timeout="300" />
            </batch:tasklet>
     </batch:step>      
    </batch:job>

reader的配置如下:

<bean id="EmpDaoJdbcCursorItemReader" class="EmpDaoJdbcCursorItemReader">
        <property name="dataSource" ref="EmpDataSource" />
        <property name="sql">
            <value><![CDATA[select  * from Employee where employee_id=? and employee_zipCode=? ]]>
            </value>
        </property>
        <property name="fetchSize" value="100"></property>
        <property name="rowMapper" ref="EmployeeMapper" />
    </bean>

class EmployeeQueryCriteria 有两个字段 employee_idemployee_zipCode.

在其中一个步骤中,我将创建 ArrayListEmployeeQueryCriteria 个对象,必须为其获取数据。

所以我的问题是: 1.Is 有一种方法可以将此列表传递给 EmpDaoJdbcCursorItemReader,它将遍历对象并设置 EmployeeQueryCriteria 对象的参数值 2.Can 我循环执行该步骤以读取包含 EmployeeQueryCriteria 创建的 ArrayList 中每个项目的数据并获取数据。

class EmpDaoJdbcCursorIte‌ mReader:

public class EmpDaoJdbcCursorIte‌​mReader extends JdbcCursorItemReader{
    @BeforeStep
    public void beforeStep(StepExecution stepExecution)
    {
    StringBuffer sqlQuerySB= new StringBuffer(super.getSql());
    sqlQuerySB.append((").append(/*I am adding a comma seperated list of employee ids*/).append(")");
        super.setSql(sqlQuerySB.toString());
    }
}

我的Spring配置如下:

Spring-batch-core 2.2.2
Spring-beans 3.2.3
Spring-context 3.2.3

有人可以提供有关如何解决此问题的建议。

您可以按照以下代码模型循环执行这些步骤

<decision id="testLoop" decider="iterationDecider">
        <next on="CONTINUABLE" to="pqrStep" />
        <end on="FINISHED" />
</decision>
<step id="pqrStep" next="xyzStep">
        <tasklet ref="someTasklet" />
    </step>
<step id="xyzStep" next="testLoop">
        <tasklet ref="someOtherTasklet" />
</step>

配置为

<bean id="iterationDecider" class="com.xyz.StepFlowController" />

下面class会根据条件处理流量

public class StepFlowController implements JobExecutionDecider{

@Override
public FlowExecutionStatus decide(JobExecution jobExecution, StepExecution stepExecution) {
    FlowExecutionStatus status = null;
    try {
        if (conditionIsTrue) {
        status = new FlowExecutionStatus("CONTINUABLE");
    }else {
        status = new FlowExecutionStatus("FINISHED");
    }
} catch (Exception e) {
    e.printStackTrace();
}
    return status;
}