我正在考虑在 Writer 中使用静态变量,并使用 Step Context/Job Context 将其获取到 Step Listener 的 afterStep() 中。然而,当我尝试它时,我得到了空。
The 项目编写器此时可能已经被摧毁了,但我不确定。
这是正确的做法吗?
是的,应该足够好了。但是,您需要确保所有分区共享总行数,因为批处理运行时维护步骤上下文每个分区克隆。你应该使用JobContext
.
我认为使用分区收集器 and 分区分析器也是一个不错的选择。界面分区收集器有一个方法collectPartitionData()
收集来自其分区的数据。收集后,批处理运行时会将这些数据传递给分区分析器来分析数据。请注意,有
- 每步 N 个 PartitionCollector(每个分区 1 个)
- 每步 N 个 StepContext(每个分区 1 个)
- 每步 1 个分区分析器
写入的记录可以通过步骤上下文's transientUserData
。自从步骤上下文为其自己的步进分区保留,临时用户数据不会被其他分区覆盖。
这是实现:
我的项目编写者 :
@Inject
private StepContext stepContext;
@Override
public void writeItems(List<Object> items) throws Exception {
// ...
Object userData = stepContext.getTransientUserData();
stepContext.setTransientUserData(partRowCount);
}
我的分区收集器
@Inject
private StepContext stepContext;
@Override
public Serializable collectPartitionData() throws Exception {
// get transient user data
Object userData = stepContext.getTransientUserData();
int partRowCount = userData != null ? (int) userData : 0;
return partRowCount;
}
我的分区分析器
private int rowCount = 0;
@Override
public void analyzeCollectorData(Serializable fromCollector) throws Exception {
rowCount += (int) fromCollector;
System.out.printf("%d rows processed (all partitions).%n", rowCount);
}
参考 :JSR352 v1.0 最终版本.pdf https://java.net/downloads/jbatch/JSR%20352%20v1.0%20Final%20Release.pdf