Как эффективно анализировать XML с помощью Spring Batch в случае нескольких тегов - PullRequest
0 голосов
/ 21 июня 2019

У меня есть XML-файл, который мне нужно проанализировать с помощью Spring Batch, но я не уверен, как анализировать файлы в нескольких пакетах.

Пример того, как выглядит мой файл

<information>
    <college>
        <header info>
    </college>
    <student>
        <student 1 info>
    </student>
    <student>
        <student 2 info>
    </student>
    <student>
        <student 3 info>
    </student>
</information>

Образец записи студента

<student>
        <name>Tony Tester</name>
        <rollNo>1</rollNo>
        <enrollmentDate>2016-10-31</enrollmentDate>
        <sampleTimeStamp>2016-11-07T05:50:45</sampleTimeStamp>
        <salary>16.57</salary>
</student>

В моем случае для студента может быть N записей, а значение N может быть очень большим. Мое требование состоит в том, чтобы проанализировать файл XML и поместить данные всех студентов в базу данных, и, поскольку я использую Spring Batch, я не хочу загружать весь файл XMl одновременно. Из-за большого количества записей я хочу читать данные об учениках в пакетах, скажем, размером порции 300. Мой Java POJO выглядит как

Information.java

@XmlRootElement(name="information")
public class Information
{
      @XmlElement(name="college")
      private College college;

      @XStreamAlias("student")
      private List<Student> student;

      ... getter, setter and constructor
}

Я не уверен, выполнимо ли мое требование или нет, и если возможно, как мне написать код для моего itemReader в конфигурации весенней партии. На данный момент я пытался читать только данные учеников без тегов колледжа и для этой реализации мой читатель выглядит как

ItemReader

 @StepScope
    @Bean(name="xmlReader")
    public SynchronizedItemStreamReader<StudentDTO> reader() 
    {
        StaxEventItemReader<StudentDTO> xmlFileReader = new StaxEventItemReader<>();
        xmlFileReader.setResource(new ClassPathResource("students.xml"));
        xmlFileReader.setFragmentRootElementName("student");

        Map<String, Class<?>> aliases = new HashMap<>();
        aliases.put("student", StudentDTO.class);

        StudentConverter converter = new StudentConverter();

        XStreamMarshaller xStreamMarshaller = new XStreamMarshaller();
        xStreamMarshaller.setAliases(aliases);
        xStreamMarshaller.setConverters(converter);

        xStreamMarshaller.getXStream().addPermission(NoTypePermission.NONE);
        xStreamMarshaller.getXStream().addPermission(NullPermission.NULL);
        xStreamMarshaller.getXStream().addPermission(PrimitiveTypePermission.PRIMITIVES);
        xStreamMarshaller.getXStream().allowTypeHierarchy(Collection.class);        
        xStreamMarshaller.getXStream().allowTypesByWildcard(new String[] {"com.example.demo.**"});        

        xmlFileReader.setUnmarshaller(xStreamMarshaller);


        SynchronizedItemStreamReader< StudentDTO> synchronizedItemStreamReader = new SynchronizedItemStreamReader<>();
        synchronizedItemStreamReader.setDelegate(xmlFileReader);
        return synchronizedItemStreamReader;
    } 

Я ссылался на некоторые ссылки, но не понял, как подходить к проблеме. Пожалуйста, дайте мне какое-то решение для моей проблемы и некоторые ссылки для начала. Заранее спасибо

1 Ответ

0 голосов
/ 21 июня 2019

В моем случае для студента может быть N записей, а значение N может быть очень большим. Мое требование состоит в том, чтобы проанализировать файл XML и поместить данные всех студентов в базу данных, и, поскольку я использую Spring Batch, я не хочу загружать весь файл XMl одновременно. Из-за большого количества записей я хочу читать данные об учениках в пакетах, скажем, размером в порцию 300.

Вот как работает ориентированная на куски модель обработки Spring Batch.

Вам необходимо настроить шаг, ориентированный на порцию, с размером порции 300. Spring Batch будет одновременно читать только 300 элементов XML в памяти (а не весь входной файл), обрабатывать / записывать их перед чтением следующего кусок.

Вы можете найти пример, используя StaxEventItemReader в примере XML Input * Output . Соответствующий раздел здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...