De que se trata o artigo:

Utilização do framework Spring Batch para criar uma aplicação batch de exemplo simulando a integração entre sistemas distintos utilizando diferentes fontes de entrada (CSV e banco de dados) para popular uma base de dados destino.


Para que serve:

Fornecer uma solução para criação de aplicações batch, reduzindo o acoplamento entre os componentes utilizados e privilegiando a facilidade de manutenção através de componentes prontos para uso ou customizáveis como Jobs, Steps, Item Readers e Item Writers fornecidos pelo framework.


Em que situação o tema é útil:

A utilização do framework Spring Batch é útil em qualquer cenário onde a integração de sistemas torna-se necessária, facilitando a construção de aplicações batch flexíveis e mais fáceis de alterar.

Conhecendo o Spring Batch:

O Spring Batch Framework é parte do projeto Spring, e visa fornecer funções reutilizáveis para o processamento e gerenciamento de dados em um determinado cenário de integração de sistemas através de aplicações batch. Por exemplo, ler um arquivo texto de largura fixa e gerar um arquivo CSV (Comma Separated Value) como saída, consultar um banco de dados, transformá-lo e atualizar o banco de dados de uma aplicação externa, etc. O fluxo da aplicação a ser desenvolvida vai depender das regras de negócio definidas para cada aplicação e da estratégia de integração a ser adotada. Não existe uma lógica pré-definida, por isso precisamos de uma solução flexível e produtiva para criarmos integrações entre sistemas distintos sem “reinventar a roda”.

Neste artigo, vamos criar uma aplicação em Java para realizar o processamento em lote de duas fontes de dados distintas e importar os dados para uma tabela de um banco de dados exemplo.

Neste contexto, são programas executados em background com o objetivo de realizar um processamento qualquer sem a intervenção direta de usuários.

A primeira fonte de dados será um arquivo CSV (campos separados por vírgula, do correspondente em inglês a Comma Separated Value) e a segunda uma tabela de um banco de dados.

Para nos ajudar nesta tarefa, faremos uso do framework Spring Batch, que provê uma abstração sobre batch, jobs e steps (desenvolvedores de aplicações batch já são familiarizados com estes termos, veja o significado de cada um deles em suas respectivas notas DevMan), e facilita algumas operações comuns para este tipo de aplicação, tais como: processar grandes volumes de registros, agendamento de tarefas, reprocessamento em caso de falhas, logging/tracking, transações, entre outras características. Com isso, o desenvolvedor ganha mais tempo e foca apenas na lógica de negócio da aplicação, deixando para o framework questões relacionadas à infraestrutura.

Batch: É um conjunto de jobs executados por uma única aplicação que possui um fluxo de processamento bem definido.

Job: É definido como um conjunto de steps que juntos executam uma determinada tarefa de um fluxo de processamento. Podemos dizer que um Job significa uma determinada tarefa de processamento que possui um nome e a ordem de execução dos steps que o compõe. Observe a configuração simplificada abaixo:


  <job id="Nome do Job">
     <step id="passo1" next="passo2"/>
     <step id="passo2" next="passo3"/>
     <step id="passo3"/>
  </job> 

Step: Representa um passo a ser executado dentro de um determinado Job. Podemos dizer que um step é uma ação que lê, escreve ou envia informações nos mais diversos formatos.

O termo lote ou batch é bastante comum para programadores de Mainframe. As aplicações batch podem ser consideradas como programas ou rotinas executadas em segundo plano que possuem um fluxo a percorrer e sem a intervenção direta do usuário.

O Spring Batch Framework

O Spring Batch Framework é parte do projeto Spring, e visa fornecer funções reutilizáveis para o processamento e gerenciamento de dados em um determinado cenário de integração. Por exemplo, ler um arquivo texto de largura fixa e gerar um arquivo CSV (Comma Separated Value) como saída, consultar um banco de dados, transformá-lo e atualizar o banco de dados de uma aplicação externa, etc. O fluxo vai depender das regras de negócio definidas para cada aplicação e da estratégia de integração a ser adotada, não existe uma lógica pré-definida.

São arquivos onde cada campo informado possui tamanho fixo. Normalmente os campos numéricos são preenchidos com zeros à esquerda e os campos texto com espaços em branco à direita até que o tamanho definido para o campo seja alcançado.

Vale ressaltar que um dos principais objetivos do Spring Batch é livrar os desenvolvedores de reinventarem a roda durante a criação de aplicações Java para processamento de dados e integração, provendo uma camada básica com os serviços e técnicas necessárias para execução e gerenciamento de qualquer cenário relacionado às aplicações batch; tudo isso baseado em configurações Java Beans relativamente simples, injetadas em arquivos XML, como veremos mais adiante neste artigo.

A seguir, apresentamos os principais componentes do Spring Batch: Item Reader e Item Writer.

Item Reader

Um Item Reader do Spring Batch é uma abstração de qualquer fonte de dados que será utilizada como entrada para um determinado step dentro de um job. São exemplos de Item Reader: uma consulta a um banco de dados, um arquivo texto, um arquivo XML, filas, etc.

Para criar um novo Item Reader, devemos implementar a interface org.springframework.batch.item.ItemReader, que nos obrigará a implementar um método read(), ou utilizar uma das implementações concretas e prontas para uso fornecidas pelo Spring Batch. As classes JdbcCursorItemReader, FlatFileItemReader e JmsItemReader são alguns exemplos de implementações concretas de Item Reader.

Item Writer

Ao contrário do Item Reader, que apenas lê informações de uma determinada fonte de dados, o Item Writer escreve ou envia informações em determinada fonte de dados. Podemos dizer que um Item Writer é uma abstração para a saída de um determinado step.

Para criar um novo Item Writer, devemos implementar a interface org.springframework.batch.item.ItemWriter, que nos obrigará a implementar um método write(), ou utilizar uma das implementações concretas e prontas para uso fornecidas pelo Spring Batch. As classes FlatFileItemWriter, HibernateItemWriter, IbatisBatchItemWriter são exemplos de implementações concretas de Item Writer.

Ainda neste artigo vamos criar dois Item Writer para a aplicação exemplo, como veremos adiante.

Criando o exemplo

O exemplo que desenvolveremos se inspira numa aplicação utilizada por uma empresa de Turismo e tem como requisito principal a importação das tarifas de dois fornecedores (X e Y) para um banco de dados. O primeiro fornecedor enviará os dados através de um arquivo texto e o segundo disponibilizará uma tabela de um banco de dados. Em resumo, teremos duas fontes distintas que serão importadas para um banco de dados.

Para simplificar as coisas, não entraremos em detalhes de como o arquivo será disponibilizado para empresa e nem cobriremos os fluxos alternativos relacionados e que fariam sentido numa aplicação real, como por exemplo, validação dos campos obrigatórios, formato de datas e números e tratamento de exceções.

...
Quer ler esse conteúdo completo? Tenha acesso completo