Я хочу, чтобы текущий ресурс, обрабатываемый MultiResourceItemReader, был доступен в методе beforeStep - PullRequest
2 голосов
/ 16 декабря 2011

Есть ли способ сделать currentResource , обработанный MultiResourceItemReader , чтобы сделать его доступным в методе beforeStep . Пожалуйста, предоставьте мне рабочий код sample. Я пытался вставить ссылку на несколько ресурсов для чтения в stepexecutionlistener , но пружинный cglib принимает только тип интерфейса для инъекции, я не знаю, использовать ли ItemReader или ItemStream интерфейс.

Ответы [ 4 ]

4 голосов
/ 27 августа 2012

MultiResourceItemReader теперь имеет метод getCurrentResource(), который возвращает текущий Resource.

1 голос
/ 20 декабря 2011

возможно, если вы используете Шаг разбиения и Связывание входных данных с шагами Концепция

простой пример кода с пределом параллелизма 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>

потенциальные недостатки:

  • отдельные шаги для каждого файла вместо одного шага
  • более сложная конфигурация
1 голос
/ 18 декабря 2011
  • Получение currentResource из MultiResourceItemReader в данный момент невозможно.Если вам нужно это усовершенствование API, создайте его в Spring Batch JIRA .
  • Даже если есть метод получения для currentResource, его значение недопустимо в beforeStep().Это допустимо между open() и close().
0 голосов
/ 04 августа 2018

Используя метод getCurrentResource () из MultiResourceItemReader , обновите 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...