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_id
和 employee_zipCode
.
在其中一个步骤中,我将创建 ArrayList
个 EmployeeQueryCriteria
个对象,必须为其获取数据。
所以我的问题是:
1.Is 有一种方法可以将此列表传递给 EmpDaoJdbcCursorItemReader
,它将遍历对象并设置 EmployeeQueryCriteria
对象的参数值
2.Can 我循环执行该步骤以读取包含 EmployeeQueryCriteria
创建的 ArrayList 中每个项目的数据并获取数据。
class EmpDaoJdbcCursorIte mReader:
public class EmpDaoJdbcCursorItemReader 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;
}
我的用例如下: 有一个员工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_id
和 employee_zipCode
.
在其中一个步骤中,我将创建 ArrayList
个 EmployeeQueryCriteria
个对象,必须为其获取数据。
所以我的问题是:
1.Is 有一种方法可以将此列表传递给 EmpDaoJdbcCursorItemReader
,它将遍历对象并设置 EmployeeQueryCriteria
对象的参数值
2.Can 我循环执行该步骤以读取包含 EmployeeQueryCriteria
创建的 ArrayList 中每个项目的数据并获取数据。
class EmpDaoJdbcCursorIte mReader:
public class EmpDaoJdbcCursorItemReader 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;
}