#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 и проверить, работает ли это решение.