Dead Programmer
Dead Programmer

Reputation: 12575

I want the current resource processed by MultiResourceItemReader available in beforeStep method

Is there any way to make the currentResource processed by MultiResourceItemReader to make it available in the beforeStep method.Kindly provide me a working code sample. I tried injected multiresourcereader reference in to stepexecutionlistener , but the spring cglib only accepts an interface type to be injected ,i dont know whether to use ItemReader or ItemStream interface.

Upvotes: 2

Views: 3286

Answers (5)

andyd
andyd

Reputation: 76

If you make the item you are reading implement ResourceAware, the current resource is set as it is read

public class MyItem implements ResourceAware {

    private Resource resource;
    //others

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

    public Resource getResource() {
        return resource;
    }

}

and in your reader, processor or writer

myItem.getResource()

will return the resource it was loaded from

Upvotes: 0

Kelvin Muia
Kelvin Muia

Reputation: 346

Using the getCurrentResource() method from MultiResourceItemReader, update the stepExecution. Example code as below

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;
}

Upvotes: 0

apk
apk

Reputation: 41

The MultiResourceItemReader now has a method getCurrentResource() that returns the current Resource.

Upvotes: 4

Michael Pralow
Michael Pralow

Reputation: 6630

it is possible, if you use a Partition Step and the Binding Input Data to Steps concept

simple code example, with concurrency limit 1 to imitate "serial" processing:

<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>

example step configuration:

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

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

potential drawbacks:

  • distinct steps for each file instead of one step
  • more complicated configuration

Upvotes: 1

dma_k
dma_k

Reputation: 10639

  • Retrieving of currentResource from MultiResourceItemReader is not possible at the moment. If you need this API enhancement, create one in Spring Batch JIRA.
  • Even if there is a getter for currentResource, it's value is not valid in beforeStep(). It is valid between open() and close().

Upvotes: 1

Related Questions