Spring Batch III: Escritores (Writer)

En esta tercera entrada, Spring Batch III: Escritores (Writer), realizaré la descripción de cómo se definen entidades escritoras de ficheros CSV y ficheros XML. Las entradas anteriores, para el nuevo lector, son las siguientes: Spring Batch I: Introducción, en donde realicé una introducción de Spring Batch, así como, la definición de un ejemplo base; en la segunda entrada, Spring Batch II: Lectores (Reader), realicé una descripción de cómo se definen entidades lectoras de ficheros CSV y XML.

Definición del proceso

El proceso ejemplo que realizaré en esta entrada realizará la escritura de dos ficheros: un fichero csv, y, el segundo, un fichero xml. El proceso tendrá dos pasos o step: el primer paso, realiza la escritura de un fichero csv a partir de la lectura de un fichero txt; y, el segundo paso, realiza la escritura de un fichero xml a partir de la lectura de un fichero txt; en cada uno de ellos, se realiza la definición de un procesador para cada tipo de fichero y el valor del atributo commit-interval se define con valor 1, es decir, se realiza una procesamiento por cada línea leída.

El snippet de la definición del proceso es la siguiente:

<batch:job id="EjemploEscritores">
 <batch:step id="step1" next="step2">
    <batch:tasklet>
      <batch:chunk reader="txtFileItemReader" writer="csvItemWriter"
         processor="filterFileCsvDTOProcessor" commit-interval="1">
      </batch:chunk>
    </batch:tasklet>
 </batch:step>
 <batch:step id="step2">
   <batch:tasklet>
     <batch:chunk reader="txtFileItemReader" writer="xmlItemWriter"
        processor="filterFileXmlDTOProcessor" commit-interval="1">
     </batch:chunk>
   </batch:tasklet>
 </batch:step>
</batch:job>

Definición del lector

En el proceso se realiza la definición de un lector que realizará la lectura de un fichero txt, cuya lectura, será escrita en el fichero csv y en el fichero xml. La definición de la entidad lectora es la misma que se realiza en las entradas anteriores. Los datos leídos se representan con la clase FileTxtDTO.

Definición de un procesador de fichero CSV

El procesador del fichero csv se identifica con el literal “filterFileCsvDTOProcessor” el cual identifica a un componente Spring que implementa el interfaz ItemProcessor. En nuestro caso, se corresponde con la clase FilterFileCsvDTOProcessor, cuyo código es el siguiente:

@Component("filterFileCsvDTOProcessor")
public class FilterFileCsvDTOProcessor implements
    ItemProcessor<FileTxtDTO, FileCsvDTO> {
 @Autowired
 private IServicio servicio;
 public FileCsvDTO process(FileTxtDTO item) throws Exception {
    System.out.println("Entramos en FilterFileTxtDTOProcessor, item:"
      + item);
    FileCsvDTO result = new FileCsvDTO();
    result.setCantidad(item.getCantidad());
    result.setNombre(item.getNombre() + "-" + servicio.getValor());
    return result;
 }
}

La funcionalidad básica de este procesador es transformar la entidad leída en el fichero txt en una entidad con los datos del fichero CSV, es decir, transformar la entidad de entrada FileTxtDTO en la entidad FileCsvDTO.

Definición de un escritor de un fichero CSV

Una vez que se tiene una entidad con los datos de una línea a escribir en el fichero csv, definimos la entidad escritora mediante un Bean de la clase FlatFileItemWriter cuyo identificador es “csvItemWriter”. Los atributos a destacar de este bean son los siguientes:

  • Resource.- Se define la localización del fichero de salida.
  • LineAggregator.- Se define la entidad que implementa el interfaz ItemAggregator para la definición del formato de la salida. En nuestro caso, se define los campos nombre y cantidad, lo cuales representan los nombre de los atributos de la entidad FileCsvDTO, y la separación entre los campos representado por una coma.

El snippet de definición del escritor de un fichero csv es el siguiente:

<bean id="csvItemWriter" class="org.springframework.batch.item.file.FlatFileItemWriter"
 scope="step">
   <property name="resource" value="file:csv/salida/salida.csv" />
   <property name="lineAggregator">
     <bean
       class="org.springframework.batch.item.file.transform.DelimitedLineAggregator">
       <property name="delimiter" value="," />
       <property name="fieldExtractor">
        <bean
          class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor">
          <property name="names" value="nombre, cantidad" />
        </bean>
      </property>
    </bean>
  </property>
</bean>

Definición de un procesador de un fichero XML

El procesador del fichero XML se identifica con el literal “filterFileXmlDTOProcessor” el cual identifica a un componente Spring que implementa el interfaz ItemProcessor. En nuestro caso, se corresponde con la clase FilterFileXmlDTOProcessor, cuyo código es el siguiente:

@Component("filterFileXmlDTOProcessor")
public class FilterFileXmlDTOProcessor implements
   ItemProcessor<FileTxtDTO, FileXmlDTO> {
 @Autowired
 private IServicio servicio;
 /**
 * @see org.springframework.batch.item.ItemProcessor#process(java.lang.Object)
 */
 public FileXmlDTO process(FileTxtDTO item) throws Exception {
    System.out.println("Entramos en FilterFileXmlDTOProcessor, item:"
       + item);
    FileXmlDTO result = new FileXmlDTO();
    result.setNombre(item.getNombre() + "-" + servicio.getValor());
    result.setCantidad(item.getCantidad());
    return result;
 }
}

La funcionalidad básica de este procesador es transformar la entidad leída en el fichero txt en una entidad con los datos del fichero XML, es decir, transformar la entidad de entrada FileTxtDTO en la entidad FileXmlDTO.

Definición de un escritor de un fichero XML

Una vez que se tiene una entidad con los datos de una línea a escribir en el fichero XML, definimos la entidad escritora mediante un Bean de la clase StaxEventItemWriter cuyo identificador es “xmlItemWriter”. Los atributos de este bean son los siguientes:

  • Resource.- Identificación del path del fichero de salida.
  • RootTagName.- Literal del nodo raíz del fichero de salida.
  • Marshaller.- Referencia a la entidad de tratamiento de componentes XML. En nuestro caso, la clase con la estructura de un nodo XML es el bean FileXmlDTO.

El snippet de definición del escritor de un fichero XML es el siguiente:

 <bean id="xmlItemWriter" class="org.springframework.batch.item.xml.StaxEventItemWriter">
   <property name="resource" value="file:xml/salida/salida.xml" />
   <property name="marshaller" ref="reportMarshaller" />
   <property name="rootTagName" value="NodoRaiz" />
 </bean>
 <bean id="reportMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
    <property name="classesToBeBound">
      <list>
         <value>es.directoandroid.model.FileXmlDTO</value>
      </list>
    </property>
 </bean>

Si se desea el código ejemplo se puede acceder aquí.

En la siguiente entrada, Spring Batch IV: Testing, realizaré una descripción del proceso de testing de un proceso.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s