Разделитель элементов весенней партии

У меня есть следующая проблема: у меня есть файл, в котором каждая строка приводит к записи 1 или более элементов в базу данных. Мне нужно выполнить поиск из другой системы, чтобы узнать, сколько элементов нужно записать. Каждый из элементов, полученных из одной строки, должен быть преобразован с использованием цепочки обработчиков элементов и, наконец, записан в несколько таблиц в БД.

Поскольку каждый элемент должен записывать в несколько таблиц, каждый из них должен быть в своей собственной транзакции. Из-за этого я не могу просто иметь ItemProcessor<Foo, List<Bar>>, который справится с этим. В этом случае — даже с commit-interval равным 1 — я бы получил несколько элементов в одной транзакции.

Я видел это уже вопрос о переполнении стека. Принятый ответ не помогает мне из-за проблемы с транзакцией. Другой ответ об использовании сплиттера Spring Integration звучит интригующе. Тем не менее, это не дает тонны деталей. Как определить вывод считывателя как вход канала? Как мне определить выходной канал, который идет к моему писателю? Как я мог по-прежнему запускать цепочку обработчиков элементов для каждого вновь разделенного элемента?

Мне не удалось найти примеры использования сплиттера в весеннем пакетном задании. Любые рекомендации будут оценены.


person Zack Marrapese    schedule 11.03.2013    source источник
comment
почему бы вам не использовать ClassifierCompositeItemWriter static.springsource.org/spring-batch/apidocs/org/   -  person Serkan Arıkuşu    schedule 12.03.2013
comment
@SerkanArıkuşu Здесь нет ничего, что нужно классифицировать. Все идет к тому же писателю. Я считаю, что средство записи составных элементов используется для передачи определенных элементов определенным авторам элементов на основе классификатора. Если я что-то упустил, пожалуйста, дайте мне знать.   -  person Zack Marrapese    schedule 13.03.2013
comment
Вы когда-нибудь находили решение в этом? У меня точно такой же сценарий.   -  person Marseld    schedule 22.03.2017


Ответы (1)


Были такие же проблемы с FlatFileItemReader, за исключением проблемы с транзакцией. Решил так:

public class FlatFileItemListWriter<T> extends FlatFileItemWriter<T> {

    /**
     * {@inheritDoc}
     * 
     * @see org.springframework.batch.item.file.FlatFileItemWriter#write(java.util.List)
     */
    @Override
    @SuppressWarnings("unchecked")
    public void write(List<? extends T> itemsLists) throws Exception {
        List<T> items = new ArrayList<T>();
        for (Object item : itemsLists) {
            items.addAll((List<T>) item);
        }
        super.write(items);
    }

}

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

person Alexis LEGROS    schedule 24.03.2015