Spring Batch Javaconfig - параметризация интервала фиксации aka chunksize

с конфигурацией Spring Batch на основе xml вы можете параметризовать интервал фиксации / размер блока, например:

<job id="basicSimpleJob" 
     xmlns="http://www.springframework.org/schema/batch">
    <step id="basicSimpleStep" >
        <tasklet>
            <chunk
                reader="reader" 
                processor="processor" 
                writer="writer" 
                commit-interval="#{jobParameters['commit.interval']}">
            </chunk>
        </tasklet>
    </step>
</job>

с конфигурацией на основе javaconfig это может выглядеть как

@Bean
public Step step(
        ItemStreamReader<Map<String, Object>> reader,
        ItemWriter<Map<String, Object>> writer,
        @Value("#{jobParameters['commit.interval']}") Integer commitInterval
) throws Exception {
    return steps
            .get("basicSimpleStep")
            .<Map<String, Object>, Map<String, Object>>chunk(commitInterval)
            .reader(reader)
            .processor(new FilterItemProcessor())
            .writer(writer)
            .build();
}

но это не работает, я тоже получаю

Вызвано: org.springframework.expression.spel.SpelEvaluationException: EL1008E: (pos 0): свойство или поле 'jobParameters' не может быть найдено в объекте типа 'org.springframework.beans.factory.config.BeanExpressionContext' - возможно, не общедоступно ?

или - при использовании @StepScope для шагового bean-компонента -

Вызвано: java.lang.IllegalStateException: для области действия шага нет доступного держателя контекста

Я знаю, что у меня есть рабочая область действия, работают другие компоненты с этапами (определены внутри того же класса, что и этап)

прямо сейчас я использую CompletionPolicy, который работает с stepScope, но я хотел бы знать, заставил ли кто-то его работать «нормальным» способом или пришло время для тикета JIRA

... который создается по адресу https://jira.spring.io/browse/BATCH-2263 < / а>


person Michael Pralow    schedule 23.06.2014    source источник


Ответы (2)


Добавление аннотации @JobScope к определению шага работает в Spring Batch 3:

@Bean
@JobScope
public Step step(
        ItemStreamReader<Map<String, Object>> reader,
        ItemWriter<Map<String, Object>> writer,
        @Value("#{jobParameters['commit.interval']}") Integer commitInterval
)

Это инициализирует компонент step при выполнении задания, поэтому в этом случае работает поздняя привязка параметров jobParameters.

person Rainer Montag    schedule 26.01.2016
comment
criskey moses на костыле это заняло много времени, чтобы найти СПАСИБО! - person Jim; 12.06.2019

У меня нет уверенности в JavaConfig и, возможно, это может быть проблемой только для интервала фиксации во время позднего связывания для конфигурации java (в SB ChunkElementParser.java исходный текст несколько строк кода, который проверяет интервал фиксации, начинается с символа # и вводит SimpleCompletionPolicy шаг в области видимости); вы можете попробовать ввести StepCompletionSimpletionSimpleExecutionSimple / a> и проверьте, работает ли это решение.

Кроме того, я никогда не пробовал интервал фиксации позднего связывания с конфигурацией xml, но есть [открытый билет с заголовком Интервал фиксации не работает должным образом при использовании позднего связывания

В качестве последнего шанса, если вы используете версию 3.0, вы также можете аннотировать шаг с помощью @ JobScope и проверьте, работает ли это решение.

person Luca Basso Ricci    schedule 24.06.2014