我需要将 Job ExecutionId 存储为 Entity 的字段之一。(我正在使用 JpaItemWriter)这里的主题之一从 StepExcecution 解释,我可以得到 StepContext -> JobExecution。在那种情况下如何获得 StepExecution?
(我不需要将任何数据从一个步骤传递到另一个步骤,我只需要 JobExecuionId)
感谢您的帮助,穆尼尔·艾哈迈德
我需要将 Job ExecutionId 存储为 Entity 的字段之一。(我正在使用 JpaItemWriter)这里的主题之一从 StepExcecution 解释,我可以得到 StepContext -> JobExecution。在那种情况下如何获得 StepExecution?
(我不需要将任何数据从一个步骤传递到另一个步骤,我只需要 JobExecuionId)
感谢您的帮助,穆尼尔·艾哈迈德
我建议您使用一个处理器来更新您的实体的价值。如果您的处理器直接实现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;
}
}
我们可以使用 Itemprocessor 的 @Scope("job") 将范围设置为作业,并且可以使用 @Value("#{jobExecution}") 表达式轻松获取 JobExecution,如下所示。
@Service
@Scope("job")
public class XsltTransformer implements ItemProcessor<Record, Record> {
@Value("#{jobExecution}")
private JobExecution jobExecution;
}
范围作为工作@Scope("job")
的使用和JobExecution
使用@Value("#{jobExecution}")
您必须添加以下内容:
@Value("#{stepExecution.jobExecution}")
private JobExecution jobExecution;
在您的阅读器 Writer 或处理器中。它肯定会奏效。
如果你想在 MyEntityProcessor 中使用 @BeforeStep 你必须像一个监听器一样声明它
<batch:listeners>
<batch:listener ref="myEntityProcessor" />
</batch:listeners>
当我想获取 JobInstanceID 时,我遇到了类似的问题。下面是我如何获得 StepExecution 然后检索 JobExecution。我希望这有帮助。
public class FoobarItemProcessor implements ItemProcessor<Foobar, Foobar> {
private JobExecution jobExecution;
@BeforeStep
public void beforeStep(StepExecution stepExecution) {
jobExecution = stepExecution.getJobExecution();
}