Настройка ItemWriter для работы как CompositeWriter для записи в БД и XML - PullRequest
0 голосов
/ 26 января 2019

разработка пакета для обработки XML-файла. XML будет прочитан с использованием StaxEvenItemReader, а входные данные будут проверены в процессоре. Процессор вернет новый Данные без каких-либо ошибок проверки будут сохранены в базе данных, а данные с ошибкой проверки будут записаны в базу данных с другой структурой XML. Я расширил ItemWriter для настройки написания. я хотел бы знать, является ли это хорошей практикой и будут ли какие-либо технические проблемы.

Вот конфигурация задания

@Bean
    public StaxEventItemReader<CustomerRequest> xmlReader() {
        StaxEventItemReader<CustomerRequest> itemReader = new StaxEventItemReader<>();
        fileName="customer.xml";
        FileSystemResource inputFile = new FileSystemResource(Paths.get(inputDirectory,fileName));
        itemReader.setResource(inputFile);
        itemReader.setStrict(true);
        itemReader.setFragmentRootElementName("customer");
        itemReader.setUnmarshaller(xmlReadMarshaller());
        return itemReader;
    }


    public Jaxb2Marshaller xmlReadMarshaller() {
        Jaxb2Marshaller marshaller = new Jaxb2Marshaller ();
        marshaller.setClassesToBeBound(CustomerRequest.class);
        return marshaller;
    }

    public Jaxb2Marshaller xmlWriteMarshaller() {
        Jaxb2Marshaller marshaller = new Jaxb2Marshaller ();
        marshaller.setClassesToBeBound(CustomerResponse.class);
        return marshaller;
    }


  @Bean    
  public CompositeWriter compositeCustomerWriter(CustomerItemWriter customerItemWriter,StaxEventItemWriter<CustomerResponse> customerStaxEventItemWriter) {
      CompositeWriter cw = new CompositeWriter();
      cw.setCustomerItemWriter(customerItemWriter);
      cw.setCustomerXmlWriter(customerStaxEventItemWriter);
      return cw;
  }

  @Bean
    public StaxEventItemWriter<CustomerResponse> customerStaxEventItemWriter() {
      StaxEventItemWriterBuilder<CustomerResponse> staxBuilder = new StaxEventItemWriterBuilder<>();
      FileSystemResource outputFile = new FileSystemResource(Paths.get(inputDirectory,"output.xml"));
      return staxBuilder.name("ResponseFile")
                        .rootTagName("CustomerResponse")
                        .marshaller(xmlWriteMarshaller())
                        .resource(outputFile)
                        .build();
    }

     @Bean
    public TaskletStep createCustomerStep(CustomerProcessor customerProcessor,CustomerItemWriter customerItemWriter,StaxEventItemWriter<CustomerResponse> customerStaxEventItemWriter) {
        CompositeWriter compositeInvoiceWriter = compositeInvoiceWriter(customerItemWriter,customerStaxEventItemWriter);
        return stepBuilderFactory.get(CREATE_INVOICE_STEP)
                                 .<CustomerRequest,CustomerData>chunk(100)
                                 .reader(xmlReader())
                                 .processor(customerProcessor)
                                 .writer(compositeCustomerWriter(customerItemWriter,customerStaxEventItemWriter))
                                 .stream(customerStaxEventItemWriter)
                                 .build();

    }


    public class CompositeWriter implements ItemWriter<CustomerData> {

    private ItemWriter<CustomerData> customerItemWriter;

    private StaxEventItemWriter<CustomerResponse> customerXmlWriter;

    @Override
    public void write(List<? extends CustomerData> items) throws Exception {
        customerItemWriter.write(items);             
        customerXmlWriter.write(convertToCustomerResponse(items)));       converting to different type and calling write n staxevenitem writer
    }
    }

1 Ответ

0 голосов
/ 28 января 2019

Данные без каких-либо ошибок проверки будут сохранены в базе данных, а данные с ошибкой проверки будут записаны в базу данных с другой структурой XML.

я хотел бы знать, является ли это хорошей практикой

Я бы не использовал составной ItemWriter в этом случае.«Неверные данные» можно пропустить, и SkipListener запишет их в другое место.

и возникнет при любых технических проблемах.

Технических проблем нетпроблемы, но есть функциональная «дезинформация»: с составным ItemWriter, плохие данные будут включены в общее количество элементов, которое вводит в заблуждение.Однако с SkipListener у вас будет отдельный счетчик (writeSkipCount), и вы сможете отличить хорошее количество данных от неправильного количества данных.

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