我需要将Job ExecutionId存储为Entity的一个字段。 (我正在使用JpaItemWriter) 这里的一个主题是从StepExcecution解释,我可以获得StepContext - > JobExecution。在那种情况下如何获得StepExecution?
(我不需要将任何数据从一个步骤传递到另一个步骤,我只需要JobExecuionId)
感谢您的帮助, Muneer Ahmed
答案 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;
在您的阅读器中编写器或处理器。 当然可以。