Чтение одной записи / элемента и запись нескольких записей / элементов с использованием весенней партии - PullRequest
10 голосов
/ 25 октября 2011

Я провел некоторый поиск, но не смог найти ни одного образца / примера.

У меня есть требование, чтобы считывались гео-координаты из одной таблицы (входные данные), обрабатывались для генерации POI, связанных с координатой.Таким образом, одна географическая координата приведет к одному или нескольким POI, которые необходимо вставить в другую таблицу (вывод).

В настоящее время я использую JdbcCursorItemReader и JdbcBatchItemWriter для чтения одного элемента / записи и записи одного элемента / записи,Существует также ItemProcessor, который генерирует POI для заданной гео-координаты.

Помогает ли мне этот пользовательский JdbcBatchItemWriter?

Есть идеи?ТИА.

Ответы [ 3 ]

8 голосов
/ 26 октября 2011

То, что вы действительно ищете, называется Splitter pattern:

enter image description here

Вот как это определено в Spring Integration :

Разделитель - это тип конечной точки сообщения, в обязанности которой входит принятие сообщения из его входного канала, разделение этого сообщения на несколько сообщений и затем отправка каждого из них в свой выходной канал. Обычно это используется для разделения "составного" объекта полезной нагрузки на группу Сообщений, содержащих подразделяемые полезные нагрузки.

Конфигурация чрезвычайно проста:

<channel id="inputChannel"/>

<splitter id="splitter" 
  ref="splitterBean" 
  method="split" 
  input-channel="inputChannel" 
  output-channel="outputChannel" />

<channel id="outputChannel"/>

<beans:bean id="splitterBean" class="sample.PojoSplitter"/>

Или вы можете использовать аннотации:

@Splitter
List<LineItem> extractItems(Order order) {
    return order.getItems()
}

Вы, конечно, можете написать свой JdbcBatchItemWriter, если вам проще. Однако Spring Integration уже делает это за вас.

Вы можете использовать Поддержка JDBC Spring Integration => jdbc:inbound-channel-adapter / jdbc:outbound-channel-adapter и вышеуказанный сплиттер для достижения желаемого и .. простоты.

4 голосов
/ 26 октября 2011

если вы просто хотите распространить элементы по разным авторам (прочитайте дубликаты вывода), вы можете использовать существующий CompositeItemWriter

но я не уверен, что ваш процессор будет производить разные типы элементов или если вы хотите распространить содержимое одного сложного типа элементов на несколько авторов, для этих случаев вы можете использовать слегка измененную версию для мультилинии -записатель вопрос

public class MultiOutputItemWriter implements ItemWriter<Object> {

private JdbcBatchItemWriter<ClassFoo> delegateFoo;
private JdbcBatchItemWriter<ClassBar> delegateBar;

public void write(List<? extends Object> items) throws Exception {
       // if you have different types of items
       // check Object Class
       // add to new List<Classfoo>
       // call delegate e.g. delegateFoo.write(List with ClassFoo);
       //
       // or if you have complex objects
       // same procedure as above, but with
       // add to new List<Classfoo> with item.getClassFoo
 }
}

если вы используете FlatFileItemWriter, не забудьте зарегистрировать делегатов как ItemStreams (поэтому Spring Batch откроет / закроет их для вас)

0 голосов
/ 06 января 2015

Я сделал это, расширив класс Writer (в моем случае HibernateItemWriter). Я вижу, один ответ описывает, как использовать «сплиттер». Если у кого-нибудь есть рабочий пример того, как это может работать в среде, использующей spring-boot-starter-parent, я бы с удовольствием это увидел. Для того, что я делаю (создание списка из одной записи), было бы намного проще, если бы Spring предоставил метод записи, который обрабатывал список списков.

Вот как я расширил Writer для обработки нескольких записей для каждой прочитанной / обработанной строки: Spring-Batch Многострочная запись Item Writer с переменным количеством строк в записи

...