【问题标题】:How to create multiple flows with various data using Spring Batch?如何使用 Spring Batch 创建具有各种数据的多个流?
【发布时间】:2015-04-13 12:33:09
【问题描述】:

我正在使用 Spring Batch 来处理一个数据库中的全部记录。 我应该如何处理这些数据基本上取决于每条记录。 每条记录可以有三种状态,例如 A / B / C。

我想将所有记录排序到这些阈值状态。 例如, A - 记录 1、记录 2、记录 3 B - 记录 4、记录 5、记录 6 c - 记录 7、记录 8、记录 9

然后我想根据这三个状态创建步骤流程(或工作流程?我不知道确切..)。 (步骤 'aStep' 将处理 A 类记录,'bStep' 将处理 B 类记录......等等)

如何使用 Spring Batch 做到这一点? 我已经阅读了很多关于 spring flow 的内容,这些决策基于 ExitStatus 或 BatchStatus 但找不到任何方法来做我想做的事情。

如果您知道如何执行此操作,请帮助我。

【问题讨论】:

  • 不同的状态可以并行处理吗?
  • @Michael 我真的不知道我是否可以。我只是想知道是否有什么办法可以做,但我什么也找不到
  • 您真的需要为每种类型的记录设置单独的步骤/流程吗?您是否仅通过阅读器选择所有记录(按类型排序)以及每种记录类型在处理器/写入器中的不同处理来尝试它?您甚至可以使用分区步骤将其并行化,其中每个分区仅使用一种类型的记录

标签: java spring spring-batch


【解决方案1】:

您可以在处理器级别执行此操作,但不能在步骤级别。

  @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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-22
    • 2018-10-24
    • 2014-10-21
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    • 2017-05-08
    相关资源
    最近更新 更多