如何使用 Spring Batch 创建包含各种数据的多个流?
How to create multiple flows with various data using Spring Batch?
我正在使用 Spring 批处理来处理一个数据库中的整个记录。
我应该如何处理这些数据基本上取决于每条记录。
每条记录可以有三种状态,例如A / B / C。
我想将所有记录分类为这些压力状态。
例如,
A - 记录 1、记录 2、记录 3
B - 记录 4、记录 5、记录 6
c - 记录 7、记录 8、记录 9
然后我想根据这三个状态创建步骤流程(或工作流程?我不太清楚..)。
(步骤'aStep'会处理A类记录,'bStep'会处理B类记录...等等)
如何使用 Spring Batch 执行此操作?
我已经阅读了很多关于 spring 流程、基于 ExitStatus 或 BatchStatus 的决策但找不到任何方法来完全按照我想做的事情。
如果你知道如何做到这一点,请帮助我。
您可以在处理器级别执行此操作,但不能在步骤级别执行此操作。
@Component
@Scope(value = "step")
public class AbcItemProcessor implements ItemProcessor<AbcInfo, AbcInfo> {
@Override
public AbcInfo process(AbcInfo abcInfo) throws Exception {
if (abcInfo.getRecordType().equals("H") || abcInfo.getRecordType().equals("T"))
return null;//do your changes as you want to do with record based on condition
else {
abcInfo.setIdBatch(idBatch);
abcInfo.setTmStamp(new Date(timeInMillis));
return abcInfo;
}
}
}
或者如果你坚持要这样做步级那么你可以通过编写自己的决策程序来完成它,就像通过传递自定义状态
public class StepFlowController implements JobExecutionDecider{
@Override
public FlowExecutionStatus decide(JobExecution jobExecution, StepExecution stepExecution) {
FlowExecutionStatus status = null;
try {
ExecutionContext executionContext = jobExecution.getExecutionContext();
Object validationStatus = executionContext.get("VALIDATESTATUS");
if (!Utils.isNullOrEmpty(validationStatus)) {
if (validationStatus.equals("HEADERFAIL")) {
status = new FlowExecutionStatus("HEADER");;
} else if (validationStatus.equals("TAILERFAIL")) {
status = new FlowExecutionStatus("TRAILER");
} else if (validationStatus.equals("DATACOUNTFAIL")) {
status = new FlowExecutionStatus("DATA");
}else {
status = new FlowExecutionStatus("COMPLETE");
}
}else {
status = new FlowExecutionStatus("COMPLETE");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return status;
}
}
在配置文件中,您可以像下面这样放置一个决策程序
<decision id="validationDecision" decider="validationDecider">
<next on="HEADER" to="HeaderStep" />
<next on="TRAILER" to="TrailerStep" />
<next on="DATE" to="DataStep" />
<next on="FAILED" to="FailStep" />
<next on="COMPLETE" to="CompleteStep" />
</decision>
我正在使用 Spring 批处理来处理一个数据库中的整个记录。 我应该如何处理这些数据基本上取决于每条记录。 每条记录可以有三种状态,例如A / B / C。
我想将所有记录分类为这些压力状态。 例如, A - 记录 1、记录 2、记录 3 B - 记录 4、记录 5、记录 6 c - 记录 7、记录 8、记录 9
然后我想根据这三个状态创建步骤流程(或工作流程?我不太清楚..)。 (步骤'aStep'会处理A类记录,'bStep'会处理B类记录...等等)
如何使用 Spring Batch 执行此操作? 我已经阅读了很多关于 spring 流程、基于 ExitStatus 或 BatchStatus 的决策但找不到任何方法来完全按照我想做的事情。
如果你知道如何做到这一点,请帮助我。
您可以在处理器级别执行此操作,但不能在步骤级别执行此操作。
@Component
@Scope(value = "step")
public class AbcItemProcessor implements ItemProcessor<AbcInfo, AbcInfo> {
@Override
public AbcInfo process(AbcInfo abcInfo) throws Exception {
if (abcInfo.getRecordType().equals("H") || abcInfo.getRecordType().equals("T"))
return null;//do your changes as you want to do with record based on condition
else {
abcInfo.setIdBatch(idBatch);
abcInfo.setTmStamp(new Date(timeInMillis));
return abcInfo;
}
}
}
或者如果你坚持要这样做步级那么你可以通过编写自己的决策程序来完成它,就像通过传递自定义状态
public class StepFlowController implements JobExecutionDecider{
@Override
public FlowExecutionStatus decide(JobExecution jobExecution, StepExecution stepExecution) {
FlowExecutionStatus status = null;
try {
ExecutionContext executionContext = jobExecution.getExecutionContext();
Object validationStatus = executionContext.get("VALIDATESTATUS");
if (!Utils.isNullOrEmpty(validationStatus)) {
if (validationStatus.equals("HEADERFAIL")) {
status = new FlowExecutionStatus("HEADER");;
} else if (validationStatus.equals("TAILERFAIL")) {
status = new FlowExecutionStatus("TRAILER");
} else if (validationStatus.equals("DATACOUNTFAIL")) {
status = new FlowExecutionStatus("DATA");
}else {
status = new FlowExecutionStatus("COMPLETE");
}
}else {
status = new FlowExecutionStatus("COMPLETE");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return status;
}
}
在配置文件中,您可以像下面这样放置一个决策程序
<decision id="validationDecision" decider="validationDecider">
<next on="HEADER" to="HeaderStep" />
<next on="TRAILER" to="TrailerStep" />
<next on="DATE" to="DataStep" />
<next on="FAILED" to="FailStep" />
<next on="COMPLETE" to="CompleteStep" />
</decision>