Spring Batch: Как создать Композитный элемент Writer?
Я использую Spring Batch
в Spring Boot
приложение. Spring Boot
версия 1.3.5.RELEASE
,
Я пытаюсь использовать CompositeItemWriter
так что список элементов будет сначала сжат / заархивирован WriterOne, а затем передан в WriterTwo, где они будут записаны в базу данных.
Вот мой писатель 1:
@Component
public class Writer1 implements org.springframework.batch.item.ItemWriter<SimpleObject> {
@Override
public void write(List<? extends SimpleObject> list) throws Exception {
for(SimpleObject simpleObject: list){
// code which compresses the file
}
}
}
Вот мой писатель 2:
@Component
public class Writer2 implements org.springframework.batch.item.ItemWriter<SimpleObject> {
@Override
public void write(List<? extends SimpleObject> list) throws Exception {
for(SimpleObject simpleObject: list){
// the file object meta data are being writtren to database.
}
}
}
Здесь я пытаюсь инициализировать шаг задачи и предоставить ему CompositeItemWriter вместо ItemWriter.
CompositeItemWriter compositeItemWriter = new CompositeItemWriter();
compositeItemWriter.setDelegates(Arrays.asList(writer1,writer2));
TaskletStep processingStep = stepBuilderFactory.get(getLabel() + "-" + UUID.randomUUID().toString())
.<SimpleObject, SimpleObject>chunk(5)
.reader(reader)
.processor(processor)
.writer(compositeItemWriter).transactionManager(txManager).build();
Тогда код выдает ошибку времени компиляции:
Error:(337, 83) java: cannot find symbol
symbol: method build()
location: class org.springframework.batch.core.step.builder.StepBuilderHelper
1 ответ
Решение
Этот код ниже работает в моем случае.
Вот мой писатель 1:
@Component
public class Writer1 implements ItemStreamWriter<SimpleObject>,org.springframework.batch.item.ItemWriter<SimpleObject> {
@Override
public void write(List<? extends SimpleObject> list) throws Exception {
for(SimpleObject simpleObject: list){
// some logic
}
}
}
@Override
public void open(ExecutionContext executionContext) throws ItemStreamException {
}
@Override
public void update(ExecutionContext executionContext) throws ItemStreamException {
}
@Override
public void close() throws ItemStreamException {
}
}
Вот мой писатель 2:
@Component
public class Writer2 implements ItemStreamWriter<SimpleObject>, org.springframework.batch.item.ItemWriter<SimpleObject> {
@Override
public void write(List<? extends SimpleObject> list) throws Exception {
for(SimpleObject simpleObject: list){
// some logic
}
}
@Override
public void open(ExecutionContext executionContext) throws ItemStreamException {
}
@Override
public void update(ExecutionContext executionContext) throws ItemStreamException {
}
@Override
public void close() throws ItemStreamException {
}
}
Здесь я пытаюсь инициализировать Tasklet
и предоставляя это CompositeItemWriter
:
CompositeItemWriter<SimpleObject> compositeItemWriter = new CompositeItemWriter<>();
List<org.springframework.batch.item.ItemWriter<? super SimpleObject>> delegates = new ArrayList<>();
delegates.add(writer1);
delegates.add(writer2);
compositeItemWriter.setDelegates(delegates);
TaskletStep processingStep = stepBuilderFactory.get(getLabel() + "-" + UUID.randomUUID().toString())
.<SimpleObject, SimpleObject>chunk(5)
.reader(reader)
.processor(processor)
.writer(compositeItemWriter)
.stream(writer1)
.stream(writer2)
.transactionManager(txManager)
.build();
Пожалуйста, дайте мне знать, если я что-то пропустил или имел какую-то неверную информацию.