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

时间:2013-01-10 17:20:16

标签: spring-batch

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

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

感谢您的帮助, Muneer Ahmed

6 个答案:

答案 0 :(得分:4)

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

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

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

}

答案 1 :(得分:2)

我建议您使用可以更新实体的处理器。如果您的处理器直接实现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;
}

}

答案 2 :(得分:1)

如果要在MyEntityProcessor中使用@BeforeStep,则必须将其声明为侦听器

<batch:listeners>
 <batch:listener ref="myEntityProcessor" />
</batch:listeners>

答案 3 :(得分:1)

使用@Scope("job")作为工作的范围并使用JobExecution获取@Value("#{jobExecution}")

答案 4 :(得分:0)

当我想获得JobInstanceID时,我遇到了类似的问题。下面是我如何获得StepExecution然后转发JobExecution。我希望这会有所帮助。

public class FoobarItemProcessor implements ItemProcessor<Foobar, Foobar> {

private JobExecution jobExecution;

@BeforeStep
public void beforeStep(StepExecution stepExecution) {
    jobExecution = stepExecution.getJobExecution();
}

答案 5 :(得分:0)

您必须添加以下内容:

@Value("#{stepExecution.jobExecution}")

private JobExecution jobExecution;

在您的阅读器中编写器或处理器。 当然可以。