I need to store Job ExecutionId as one of the fields of Entity. (I am using JpaItemWriter) One of topic here explains from StepExcecution, I can get StepContext -> JobExecution.
If you want to use @BeforeStep in MyEntityProcessor you must declare it like a listener
<batch:listeners>
<batch:listener ref="myEntityProcessor" />
</batch:listeners>
I would suggest you use a processor that updates your Entity with value. If your processors directly implements ItemProcessor<T>
then you will not automatically get the StepExecution
. To get the StepExecution
, do 1 of the following;
- implement StepExecutionListener and set it as a variable from the beforeStep
method
- create a method called [something](StepExecution execution)
and annotate with @BeforeStep
once you've injected the StepExecution via a listener, you can then get the jobExecutionId and set it into your entity
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;
}
}
We can set the scope as job using @Scope("job") of Itemprocessor and can easly get JobExecution using @Value("#{jobExecution}") expression as below.
@Service
@Scope("job")
public class XsltTransformer implements ItemProcessor<Record, Record> {
@Value("#{jobExecution}")
private JobExecution jobExecution;
}
You have to add the following:
@Value("#{stepExecution.jobExecution}")
private JobExecution jobExecution;
in your reader Writer or processor. It will certainly work.
I had a similar issue when I wanted to get the JobInstanceID. Below is how I got StepExecution and then retreived JobExecution. I hope this helps.
public class FoobarItemProcessor implements ItemProcessor<Foobar, Foobar> {
private JobExecution jobExecution;
@BeforeStep
public void beforeStep(StepExecution stepExecution) {
jobExecution = stepExecution.getJobExecution();
}
Scope as job using @Scope("job")
of and get JobExecution
using @Value("#{jobExecution}")