java - 如何将变量值放入分区环境的步骤上下文中并在下一步中访问这些值。我为此使用 JSR 352

标签 java spring-batch batch-processing jsr352

我的文件夹中有 10 个片段。每个段中有 2 个文件。我已经实现了分区映射器来一次读取、处理和写入一个段。

我想获取从每个段的文件中读取的记录数和插入到 DB 的记录数的值。在下一步中,发送作业的状态报告,并提及邮件中插入的记录数。

我使用 JSR 352 并使用分区映射器为每个段实现一个线程。

最佳答案

这是一个与 this 类似的问题,但这并没有具体询问如何在后续步骤中访问数据。

您可以从这两个步骤开始(如 other answer 中所述):

将数据从每个分区传递到顶级作业

1)使用每个分区的退出状态来表示该分区读取的记录数。

2) 使用PartitionAnalyzer.analyzeStatus 将它们聚合到顶级线程上的单个对象中。

例如,假设每个分区的退出状态设置为表示该分区处理的记录数的字符串化整数,您可以像这样聚合它们(此处使用简要概述的自定义 PartitionData 类显示):

       // Assumes persistent user data initialized somewhere else
        public void analyzeStatus(BatchStatus batchStatus,
        String exitStatus) throws Exception {
            if (batchStatus.equals(BatchStatus.COMPLETED)) {
                PartitionData ud = (PartitionData)stepCtx.getPersistentUserData();
                int numRecords = Integer.parseInt(exitStatus);
                pd.incrementCount(numRecords);
            }  // else maybe do something else
            // ...
        }

       // Your own class
       public class PartitionData {
           int totalNumRecords;
           public incrementCount(int numRecords) {
              totalNumRecords += numRecords;
           }
       }  

       // 
       // Setting partition exit status as num records processed not shown !
       //

这是线程安全的,因为规范保证 analyzeStatus 将在每个分区结束时在单个线程上单独调用。

将数据从一个步骤传递到下一步(以持久的方式)

现在,您可能会想简单地将这个聚合对象设置到作业的临时用户数据中。这里的问题是,如果作业在下一步失败,并且您在下一步重新启动它,则重新启动时将不会填充此数据(在作业临时用户数据中)。

所以最好以某种方式持久保存这个聚合对象。通过使用第一个(分区)步骤的持久用户数据,可以利用批处理容器的持久存储(“作业存储库”)。但这不是一句俏皮话,所以除非你问,否则我不会展示它。

关于java - 如何将变量值放入分区环境的步骤上下文中并在下一步中访问这些值。我为此使用 JSR 352,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50166210/

相关文章:

java - lambda 收集在 ifPresent 中

spring-batch - 使项目阅读器返回列表而不是单个对象-Spring 批处理

java - 大 IN 子句

java - Spring Batch 中的 MapReduce/聚合操作

java - 如何在 Hibernate 中有效地进行批量更新

youtube-api - YouTube 数据 API 的批量请求是否有效?

java - 如何使用按钮调用另一个类的方法?

java - 我收到以下代码的 SQL 语法错误和许多异常

java - 使用 ID 而不是 DATE 列有什么缺点吗?

java - Spring 批处理 : How to configure a FlatItemFileReader to read a compressed ND-JSON file?