2015-12-25 6 views
4

У меня есть пакетное задание со следующим определением:Является ли Spring Batch's ItemWriter классом singleton?

<batch:job id="job"> 
    <batch:split id="main" task-executor="simpleAsyncTaskExecutor"> 
     <batch:flow> 
      <batch:step id="getAccountDetails"> 
       <batch:tasklet ref="getAccountDetailsTasklet"/> 
      </batch:step> 
     </batch:flow> 
     <batch:flow> 
      <batch:step id="processAccounts"> 
       <batch:tasklet transaction-manager="transactionManager" task-executor="threadPoolTaskExecutor" throttle-limit="${processor.maxThreads}"> 
        <batch:chunk reader="queueReader" writer="myCustomItemWriter" commit-interval="${processor.commitInterval}"/> 
       </batch:tasklet> 
      </batch:step> 
     </batch:flow> 
    </batch:split> 
</batch:job> 

myCustomItemWriter в основном идет по списку счетов проходит с queueReader и обязывает их в базу данных.

Задача масштабируется для одновременного запуска 100 потоков этого фрагмента. В классе myCustomItemWriter у меня есть частное свойство, которое поддерживает сумму определенного свойства BigDecimal для каждой учетной записи, которую он обрабатывает. Поэтому, если есть 10000 учетных записей, у меня будет 100 потоков, каждая из которых будет обрабатывать 100 учетных записей. Я хочу захватить сумму этого имущества для всех этих 10000 учетных записей.

Вот мой вопрос: есть ли ItemWriter singleton (и, следовательно, достаточно частной собственности для поддержания этой суммы)? Если нет, должен ли я определить свой счетчик как компонент AtomicReference и ввести его в мой сценарий, чтобы тот же экземпляр свойства был введен во все 100 потоков?

ответ

1

Если вы аннотируете своего писателя с помощью @Component, то область по умолчанию будет одинарной.

Но все партийные артефакты создаются до их использования в области, в которой они объявлены в XML-задании, и действительны для срока их использования. Существуют две области, относящиеся к жизненному циклу артефакта: job и step.

В вашем случае вы можете аннотировать CustomItemWriter с @Scope("step") и так как вы работаете многопоточные партии в каждом поток будет создавать свой собственный экземпляр вашего myCustomItemWriter который будет жить только для текущего шага исполняющего.

+0

Спасибо за ваш ответ. Не следует ли @Scope («шаг») создать один экземпляр для всего шага? Я хочу, чтобы все потоки использовали -same-instance, а не создавали новый. Позвольте мне попробовать @Component. Еще раз спасибо. –