如何在ItemProcessor或ItemWriter中获得Spring Batch Job ContextId?

Mun*_*yed 10 spring-batch

我需要将Job ExecutionId存储为Entity的一个字段.(我正在使用JpaItemWriter)这里的一个主题是从StepExcecution解释,我可以得到StepContext - > JobExecution.在那种情况下如何获得StepExecution?

(我不需要将任何数据从一个步骤传递到另一个步骤,我只需要JobExecuionId)

感谢您的帮助,Muneer Ahmed

inc*_*.de 7

我建议您使用一个处理器来更新您的实体的价值。如果您的处理器直接实现,ItemProcessor<T>那么您将不会自动获得StepExecution. 要获取StepExecution,请执行以下操作之一;- 实现 StepExecutionListener 并将其设置为方法中的变量beforeStep- 创建一个名为的方法[something](StepExecution execution)并用其注释@BeforeStep

通过侦听器注入 StepExecution 后,您就可以获取 jobExecutionId 并将其设置到您的实体中

public class MyEntityProcessor implements ItemProcessor<MyEntity, MyEntity> {

private long jobExecutionId;

@BeforeStep
public void beforeStep(StepExecution stepExecution) {
    jobExecutionId = stepExecution.getJobExecutionId();
}

@Override
public MyEntity process(MyEntity item) throws Exception {
    //set the values
    item.setJobExecutionId(jobExecutionId);
    //continue
    return item;
}

}
Run Code Online (Sandbox Code Playgroud)

  • 您可以发布用于连接此 bean 的 spring 上下文 xml 吗?我遵循相同的模式,但似乎没有调用 beforeStep() 。您是否需要在某处显式地将 MyEntityProcessor bean 注册为侦听器? (4认同)

Awa*_*mar 5

我们可以使用 Itemprocessor 的 @Scope("job") 将范围设置为作业,并且可以使用 @Value("#{jobExecution}") 表达式轻松获取 JobExecution,如下所示。

@Service
@Scope("job")
public class XsltTransformer implements ItemProcessor<Record, Record> {

@Value("#{jobExecution}")
private JobExecution jobExecution;

}
Run Code Online (Sandbox Code Playgroud)

  • 我遇到了这个问题,因为项目处理器的范围是“步骤”。相反,我通过调用 stepExecution.getJobExecution() 检索了 stepExecution 并获得了作业执行。 (2认同)