11

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

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

感谢您的帮助,穆尼尔·艾哈迈德

4

6 回答 6

5

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

}
于 2013-01-10T17:49:40.273 回答
5

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

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

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

}
于 2015-10-08T12:48:33.500 回答
3

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

于 2017-01-13T07:01:12.730 回答
2

您必须添加以下内容:

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

private JobExecution jobExecution;

在您的阅读器 Writer 或处理器中。它肯定会奏效。

于 2018-10-24T10:45:50.553 回答
1

如果你想在 MyEntityProcessor 中使用 @BeforeStep 你必须像一个监听器一样声明它

<batch:listeners>
 <batch:listener ref="myEntityProcessor" />
</batch:listeners>
于 2015-03-10T11:52:21.523 回答
0

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

public class FoobarItemProcessor implements ItemProcessor<Foobar, Foobar> {

private JobExecution jobExecution;

@BeforeStep
public void beforeStep(StepExecution stepExecution) {
    jobExecution = stepExecution.getJobExecution();
}
于 2016-11-11T15:45:35.703 回答