gpt4 book ai didi

Spring Batch -@BeforeStep 未在 Partitioner 中调用

转载 作者:行者123 更新时间:2023-12-02 11:42:14 25 4
gpt4 key购买 nike

我们正在尝试使用 spring 批处理分区来实现批处理作业。在“步骤 2”中是一个分区步骤,我需要步骤 1 中的一些数据进行处理。我使用了 StepExecutionContext ,它将被提升为作业执行上下文步骤1 存储此数据。

我尝试在分区器类中使用@BeforeStep注释来获取stepExecutionContext我可以从中提取之前存储的数据并将其放入分区器的 ExecutionContext 中。但是带有 @BeforeStep 注释的方法不会在分区器中调用。

有没有其他方法可以实现这一点。

分区器实现

public class NtfnPartitioner implements Partitioner {

private int index = 0;
String prev_job_time = null;
String curr_job_time = null;

private StepExecution stepExecution ;
ExecutionContext executionContext ;

@Override
public Map<String, ExecutionContext> partition(int gridSize)
{

System.out.println("Entered Partitioner");
List<Integer> referencIds = new ArrayList<Integer>();
for (int i = 0; i < gridSize;i++) {
referencIds.add(index++);
}
Map<String, ExecutionContext> results = new LinkedHashMap<String,ExecutionContext>();
for (int referencId : referencIds) {
ExecutionContext context = new ExecutionContext();
context.put("referenceId", referencId);
context.put(NtfnConstants.PREVIOUS_JOB_TIME, prev_job_time);
context.put(NtfnConstants.JOB_START_TIME, curr_job_time);
results.put("partition." + referencId, context);
}
return results;
}

@BeforeStep
public void beforeStep(StepExecution stepExecution) {
// TODO Auto-generated method stub
System.out.println("Entered Before step in partion");
JobExecution jobExecution = stepExecution.getJobExecution();
ExecutionContext jobContext = jobExecution.getExecutionContext();
System.out.println("ExecutionContext"+jobContext);
String prev_job_time = (String) jobContext.get(NtfnConstants.PREVIOUS_JOB_TIME);
String curr_job_time = (String) jobContext.get(NtfnConstants.JOB_START_TIME);


}

最佳答案

bean 应该是步骤范围的。

Java,注释类:

@StepScope

XML,在 bean 定义中:

scope="step"

也看看这个answer关于代理bean(不确定这是否适用于您,因为除了分区程序之外没有提供其他代码)。在这种情况下,您仍然可以在步骤构建期间显式添加分区程序作为监听器:

@Autowired
private NtfnPartitioner partitioner;

...

final Step masterStep = stepBuilderFactory.get("master")
.listener(partitioner)
.partitioner("slave", partitioner)
.step(slave)
...

或者,如果您的分区器不是 bean(例如,您基于动态内容创建它),您仍然可以将其添加为监听器:

final NtfnPartitioner partitioner = new NtfnPartitioner();    
final Step masterStep = stepBuilderFactory.get("master")
.listener(partitioner)
.partitioner("slave", partitioner)
.step(slave)
...

关于Spring Batch -@BeforeStep 未在 Partitioner 中调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21597599/

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