我希望在BeforeStep方法中可以使用MultiResourceItemReader处理的当前资源

时间:2011-12-16 05:23:46

标签: spring spring-batch

是否可以通过 MultiResourceItemReader 处理 currentResource 以使其在 beforeStep 方法中可用。请提供工作代码示例。我尝试将多源资源阅读器引用注入 stepexecutionlistener ,但是spring cglib只接受要注入的接口类型,我不知道是否使用 ItemReader ItemStream 界面。

5 个答案:

答案 0 :(得分:4)

MultiResourceItemReader now has方法getCurrentResource(),返回当前Resource

答案 1 :(得分:1)

  • 目前无法从currentResource检索MultiResourceItemReader。如果您需要此API增强功能,请在Spring Batch JIRA
  • 中创建一个
  • 即使currentResource有吸气剂,它的值在beforeStep()中也无效。它在open()close()之间有效。

答案 2 :(得分:1)

如果您使用Partition StepBinding Input Data to Steps概念

,则可以

简单的代码示例,并发限制1来模仿“串行”处理:

<bean name="businessStep:master" class="org.springframework.batch.core.partition.support.PartitionStep">
    <property name="jobRepository" ref="jobRepository"/>
    <property name="stepExecutionSplitter">
        <bean class="org.springframework.batch.core.partition.support.SimpleStepExecutionSplitter">
            <constructor-arg ref="jobRepository"/>
            <constructor-arg ref="concreteBusinessStep"/>
            <constructor-arg>
                <bean class="org.spring...MultiResourcePartitioner" scope="step">
                    <property name="resources" value="#{jobParameters['input.file.pattern']}"/>
                </bean>
            </constructor-arg>
        </bean>
    </property> 
    <property name="partitionHandler">
        <bean class="org.springframework.batch.core.partition.support.TaskExecutorPartitionHandler">
            <property name="taskExecutor">
                <bean class="org.springframework.core.task.SimpleAsyncTaskExecutor">
                    <property name="concurrencyLimit" value="1" />
                </bean>
            </property>
            <property name="step" ref="concreteBusinessStep"/>
        </bean>
    </property>
</bean>

<bean id="whateverClass" class="..." scope="step">
    <property name="resource" value="#{stepExecutionContext['fileName']}" />
</bean>

示例步骤配置:

<job id="renameFilesPartitionJob">        
    <step id="businessStep" 
          parent="businessStep:master" />
</job>

<step id="concreteBusinessStep">
    <tasklet>
        <chunk reader="itemReader" 
               writer="itemWriter" 
               commit-interval="5" />
    </tasklet>
</step>

潜在的缺点:

  • 每个文件的不同步骤,而不是一步
  • 更复杂的配置

答案 3 :(得分:0)

使用 MultiResourceItemReader 中的 getCurrentResource()方法,更新stepExecution。示例代码如下

private StepExecution stepExecution;

@Override
public Resource getCurrentResource() {
    this.stepExecution.getJobExecution().getExecutionContext().put("FILE_NAME", super.getCurrentResource().getFilename());
    return super.getCurrentResource();
}

@BeforeStep
public void beforeStep(StepExecution stepExecution) {
    this.stepExecution = stepExecution;
}

答案 4 :(得分:0)

如果你让你正在阅读的项目实现ResourceAware,当前资源被设置为阅读

public class MyItem implements ResourceAware {

    private Resource resource;
    //others

    public void setResource(Resource resource) {
        this.resource = resource;
    }

    public Resource getResource() {
        return resource;
    }

}

在您的阅读器、处理器或编写器中

myItem.getResource()

将返回它从中加载的资源