У меня есть довольно основной шаг в Spring Batch работу (с помощью Java конфигурации):Spring Batch: меняющие свойства транзакций в отказоустойчивой шаг
@Bean
public Step step1() {
return stepBuilders.get("stepName")
.<Object1, Void>chunk(50)
.reader(reader(inputResource(null))
.processor(processor())
.listener(stepLogger())
.transactionAttribute(transactionTimeoutAttribute(null))
.build();
}
.......
@Bean
@StepScope
public StepExecutionListener stepLogger() {
return new StepLogger();
}
@Bean
@StepScope
public TransactionAttribute transactionTimeoutAttribute(
@Value("#{jobParameters[transactionTimeout]}") Integer timeout) {
timeout = timeout != null ? timeout : DEFAULT_TRANSACTION_TIMEOUT;
RuleBasedTransactionAttribute transactionAttribute = new RuleBasedTransactionAttribute();
transactionAttribute.setTimeout(timeout);
return transactionTimeout;
}
Как вы можете видеть, это требование о том, что тайм-аут транзакции может быть задан как параметр задания. Это работает безупречно, и если я установил слишком низкий параметр jobTimeout, выполнение задания завершится неудачно, когда транзакция закончится до завершения куска.
Однако, если я попытаюсь уклониться от отказоустойчивости (чтобы пропустить определенное количество несостоявшихся элементов), все разваливается. Когда я добавляю faultTolerant() на этапе конфигурации, чтобы иметь возможность указать политику пропуска и т.д., как это:
@Bean
public Step step1() {
return stepBuilders.get("stepName")
.<Object1, Void>chunk(50)
.reader(reader(inputResource(null))
.processor(processor())
.faultTolerant()
.listener(stepLogger())
.transactionAttribute(transactionTimeoutAttribute(null))
.build();
}
Spring больше не может начать контекст (на пристани в настоящее время), и просто бросает следующее исключение при запуске:
BeanCreationException: Error creating bean with name 'scopedTarget.transactionTimeoutAttribute': Scope 'step' is not active for the current thread; consider defining a scoped proxy for this bean if you intend to refer to it from a singleton; nested exception is java.lang.IllegalStateException: No context holder available for step scope
Что такое правильный способ определить как атрибут транзакции и пропустить политику шага в Spring Batch с помощью Java Config?
EDIT: Для того, чтобы сделать вопрос более понятным, мое требование - сделать отказоустойчивый шаг, когда тайм-аут транзакции можно настроить как параметр задания. Для отказа от отказоустойчивого шага это не проблема, просто создайте компонент TransactionAttribute с фиксированным шагом с параметрами задания, подключенными к сети. Но FaultTolerantStepBuilder по-разному обрабатывает атрибут транзакции (он в основном объединяет данный атрибут транзакции с его внутренним), поэтому шаг недоступен. Как я могу использовать параметры задания для настройки атрибута транзакции отказоустойчивого шага (Java config)?
К сожалению, проект использовал Spring Batch 2, поэтому использование области задания (правда, для новых версий Spring Batch) не сработало бы. Мы закончили удаление настраиваемого таймаута транзакции для отказоустойчивых шагов, поскольку мы не смогли найти решение. – Fredrik