我的文件夹中有 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/