2015-07-27 1 views
3

У меня есть довольно основной шаг в 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)?

ответ

0

Если вы используете Spring Batch 3 или новее, вы можете отметить атрибут транзакции и выполнить шаг как @JobScope. Это предотвратит отказоустойчивый шаг для доступа к атрибуту транзакции слишком рано.

+0

К сожалению, проект использовал Spring Batch 2, поэтому использование области задания (правда, для новых версий Spring Batch) не сработало бы. Мы закончили удаление настраиваемого таймаута транзакции для отказоустойчивых шагов, поскольку мы не смогли найти решение. – Fredrik

Смежные вопросы