如何将变量值放在分区环境的步骤上下文中并在下一步中使用它们。我正在使用JSR352

时间:2018-05-04 02:17:21

标签: java spring-batch batch-processing jsr352

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

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

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

1 个答案:

答案 0 :(得分:0)

这是与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 将在单个线程上单独调用,因为每个分区都会结束。

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

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

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