How do I get Spring Batch Job ContextId in ItemProcessor or ItemWriter?

后端 未结 6 2365
说谎
说谎 2021-02-20 18:12

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.

相关标签:
6条回答
  • 2021-02-20 18:21

    If you want to use @BeforeStep in MyEntityProcessor you must declare it like a listener

    <batch:listeners>
     <batch:listener ref="myEntityProcessor" />
    </batch:listeners>
    
    0 讨论(0)
  • 2021-02-20 18:23

    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;
    }
    
    }
    
    0 讨论(0)
  • 2021-02-20 18:28

    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;
    
    }
    
    0 讨论(0)
  • 2021-02-20 18:28

    You have to add the following:

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

    in your reader Writer or processor. It will certainly work.

    0 讨论(0)
  • 2021-02-20 18:36

    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();
    }
    
    0 讨论(0)
  • 2021-02-20 18:39

    Scope as job using @Scope("job") of and get JobExecution using @Value("#{jobExecution}")

    0 讨论(0)
提交回复
热议问题