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