1

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

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

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

4

1 回答 1

0

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

您可以从这两个步骤开始(如另一个答案中所述):

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

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将在每个分区结束时在单个线程上单独调用。

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

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

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

于 2018-05-04T10:44:15.833 回答