gpt4 book ai didi

jsr352 - JSR 352 :How to collect data from the Writer of each Partition of a Partitioned Step?

转载 作者:行者123 更新时间:2023-12-02 03:08:45 31 4
gpt4 key购买 nike

因此,我在写入数据库的步骤中有 2 个分区。我想记录每个分区写入的行数,得到总和,打印到日志中;

我正在考虑在编写器中使用static变量,并使用Step Context/Job Context在Step Listener的afterStep()中获取它。然而,当我尝试它时,我得到了null。我可以在 Reader 的 close() 中获取这些值。

这是正确的做法吗?或者我应该使用分区收集器/ reducer /分析器?

我正在 Websphere Liberty 中使用 java 批处理。我正在 Eclipse 中进行开发。

最佳答案

I was thinking of using a static variable in the Writer and use Step Context/Job Context to get it in afterStep() of the Step Listener. However when i tried it i got null.

此时ItemWriter可能已经被销毁,但我不确定。

Is this the right way to go about it?

是的,应该足够好了。但是,您需要确保所有分区共享总行数,因为批处理运行时为每个分区维护一个 StepContext 克隆。您应该使用 JobContext

我认为使用PartitionCollectorPartitionAnalyzer也是一个不错的选择。接口(interface)PartitionCollector有一个方法collectPartitionData()来收集来自其分区的数据。收集后,批处理运行时会将这些数据传递给 PartitionAnalyzer 来分析数据。请注意,有

  • 每步 N 个 PartitionCollector(每个分区 1 个)
  • 每个步骤 N 个 StepContext(每个分区 1 个)
  • 每步 1 个分区分析器

写入的记录可以通过StepContexttransientUserData传递。由于StepContext是为其自己的步骤分区保留的,因此临时用户数据不会被其他分区覆盖。

<小时/>

这里是实现:

MyItemWriter:

@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 Final Release.pdf

关于jsr352 - JSR 352 :How to collect data from the Writer of each Partition of a Partitioned Step?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37895935/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com