Java 如何在ItemWriter中获取JobParameter和JobExecutionContext?

Java 如何在ItemWriter中获取JobParameter和JobExecutionContext?,java,spring-batch,Java,Spring Batch,我想在我的ItemWriter类中检索JobParameter和JobExecutionContext对象。 如何进行 我尝试实现StepExecutionListener,通过它我只调用父类方法。但它没有成功 提前感谢。实现StepExecutionListener是一种方法。事实上,这是SpringBatch 1.x中的唯一方法 从SpringBatch 2开始,您有另一个选择:您可以将作业参数和作业执行上下文中的任何条目注入到项目编写器中。使用stepscope创建项目编写器,然后使用{j

我想在我的
ItemWriter
类中检索
JobParameter
JobExecutionContext
对象。 如何进行

我尝试实现
StepExecutionListener
,通过它我只调用父类方法。但它没有成功


提前感谢。

实现StepExecutionListener是一种方法。事实上,这是SpringBatch 1.x中的唯一方法


从SpringBatch 2开始,您有另一个选择:您可以将作业参数和作业执行上下文中的任何条目注入到项目编写器中。使用
step
scope创建项目编写器,然后使用
{jobParameters['theKeyYouWant']}
{jobExecutionContext['someOtherKey']}
等表达式向项目编写器注入值。

使用
@BeforeStep
注释在步骤处理之前调用方法

//From the StepExecution get the current running JobExecution object.
public class MyDataProcessor implements ItemProcessor<MyDataRow, MyDataRow> {
    private JobExecution jobExecution;

    @BeforeStep
    public void beforeStep(StepExecution stepExecution) {
        jobExecution = stepExecution.getJobExecution();
    }
}
//从StepExecution获取当前正在运行的JobExecution对象。
公共类MyDataProcessor实现ItemProcessor{
私人作业执行作业执行;
@先于
预处理前的公共无效(步骤执行步骤执行){
jobExecution=stepExecution.getJobExecution();
}
}

要添加到Adrian Shum的答案中,如果希望避免将每个作业参数作为类属性注入,可以直接注入
作业参数的
映射,如下所示:

@Value("#{jobParameters}")
private Map<String, JobParameter> jobParameters;
@Value(“#{jobParameters}”)
私有映射参数;

如果您使用的是Spring配置文件,则可以通过以下方式访问StepExecution对象:

<bean id="aaaReader" class="com.AAAReader" scope="step">
    <property name="stepExecution" value="#{stepExecution}" />
</bean>

处理器类和编写器类也是如此。

我通过扩展StepExecutionListenerSupport类解决了上述问题。之后,重写父类方法,该方法为'beforeStep'public void beforeStep(StepExecution StepExecution){//TODO自动生成的方法存根this.StepExecution=StepExecution;}我遇到了同样的问题,并通过扩展StepExecutionListenerSupport类尝试了您的解决方案,但没有调用afterStep和BeforStep方法。你的ItemWriter是一个步进范围的Bean吗?当我的ItemWriter是一个StepScope bean时,我也面临同样的问题。在更改回singleton bean时,将调用beforeStep和after方法。如果您的要求是将编写器作为StepExecutionListener,并对StepScope进行定义,那么这就是解决方案。。这对我很有用。Adrian,你能澄清一下这是将JobExecutionContext注入到项目读取器、写入器或处理器中的正确方法吗:1)在配置中,注入bean:,然后2)在bean:private JobExecutionContext中;(不需要@Value)是否有遗漏或错误?非常感谢。您需要将bean设置为步骤范围2。您需要“上下文”属性的setter。当一次执行多个作业时,它的行为如何?有线程安全问题吗?Step scope将为每个步骤执行创建一个新实例。使我的itemWriter StepScope出现空指针异常想知道为什么我对此投了反对票-没有任何评论?
private StepExecution stepExecution;

public void setStepExecution(final StepExecution stepExecution) {
    this.stepExecution = stepExecution;
}