Весенний пакет Javaconfig — параметризует интервал фиксации, он же размер фрагмента

#spring-batch #spring-java-config

#весенний пакет #spring-java-config

Вопрос:

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

 <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 для пошагового компонента —

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

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

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

… который создается в https://jira.spring.io/browse/BATCH-2263

Ответ №1:

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

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

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

Комментарии:

1. крики Мозеса на костыле это заняло много времени, чтобы найти СПАСИБО!

Ответ №2:

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

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

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