Я пытаюсь создать весеннее пакетное задание с использованием ListItemReader<String>
, ItemProcessor<String, String>
и ItemWriter<String>
.Весенний пакетный список списка товаров обрабатывается только один раз
XML-выглядит следующим образом,
<job id="sourceJob" xmlns="http://www.springframework.org/schema/batch">
<step id="step1" next="step2">
<tasklet>
<chunk reader="svnSourceItemReader"
processor="metadataItemProcessor"
writer="metadataItemWriter"
commit-interval="1" />
</tasklet>
</step>
<step id="step2">
<tasklet ref="lastRevisionLoggerTasklet"></tasklet>
</step>
</job>
<bean id="svnSourceItemReader"
class="com.example.repository.batch.SvnSourceItemReader"
scope="prototype">
<constructor-arg index="0">
<list>
<value>doc1.xkbml</value>
<value>doc2.xkbml</value>
<value>doc3.xkbml</value>
</list>
</constructor-arg>
</bean>
<bean id="metadataItemProcessor"
class="com.example.repository.batch.MetadataItemProcessor"
scope="prototype" />
<bean id="metadataItemWriter"
class="com.example.repository.batch.MetadataItemWriter"
scope="prototype" />
Читатель, процессор и писатель ваниль,
public class SvnSourceItemReader extends ListItemReader<String> {
public SvnSourceItemReader(List<String> list) {
super(list);
System.out.println("Reading data list " + list);
}
@Override
public String read() {
String out = (String) super.read();
System.out.println("Reading data " + out);
return out;
}
}
public class MetadataItemProcessor implements ItemProcessor<String, String> {
@Override
public String process(String i) throws Exception {
System.out.println("Processing " + i + " : documentId " + documentId);
return i;
}
}
public class MetadataItemWriter implements ItemWriter<String> {
@Override
public void write(List<? extends String> list) throws Exception {
System.out.println("Writing " + list);
}
}
Работа начинается, как это, но по расписанию каждые 10 секунд.
long nanoBits = System.nanoTime() % 1000000L;
if (nanoBits < 0) {
nanoBits *= -1;
}
String dateParam = new Date().toString() + System.currentTimeMillis()
+ "." + nanoBits;
param = new JobParametersBuilder().addString("date", dateParam)
.toJobParameters();
JobExecution execution = jobLauncher.run(job, param);
Когда приложение запускается, я вижу, что он читает, обрабатывает и записывает каждый из трех элементов в списке, переданном читателю.
Reading data doc1.xkbml
Processing doc1.xkbml : documentId doc1
Writing [doc1.xkbml]
Reading data doc2.xkbml
Processing doc2.xkbml : documentId doc2
Writing [doc2.xkbml]
Reading data doc3.xkbml
Processing doc3.xkbml : documentId doc3
Writing [doc3.xkbml]
Поскольку это sourceJob
на запланированном таймер, через каждые 10 секунд я ожидал увидеть, что список обрабатывается, но вместо этого я вижу на всех последующих запусков.
Reading data null
Кто-нибудь знает, почему это происходит? Я новичок в Spring Batch и просто не могу разобраться с проблемой.
Благодаря/ш
Спасибо, спасибо, что это именно то, что проблема была. – wsams
Отлично. Можно ли использовать ListItemReader в многопоточном шаге для одновременного обработки элементов в списке? Будет ли перезагружать работу? – vishal
Nope. ListItemReader не перезапускается, поскольку он не поддерживает ItemStrem; этот класс (от javadoc) является ** 'Полезно для тестирования' ** –